Как сделать свой собственный язык программирования? [Дубликат]

Возможный дубликат:
Учимся писать компилятор

Я оглянулся вокруг, пытаясь узнать больше о разработке языка программирования, но не смог найти много онлайн. Я нашел несколько обучающих видео, но не так много для текстовых руководств, часто задаваемых вопросов, советов и т. Д. Мне действительно любопытно, как создать свой собственный язык программирования. Это подводит меня к ТАК, чтобы спросить:

Как вы можете создать свой собственный язык программирования?

Я хотел бы построить очень простой язык. Я не планирую иметь очень хороший язык и не думаю, что он будет использоваться кем-либо. Я просто хочу создать свой собственный язык, чтобы узнать больше об операционных системах, программировании и стать лучше во всем.

С чего начать? Строим синтаксис? Сборка компилятора? Какие навыки нужны? Много сборки и понимания операционной системы? В какие языки встроено большинство компиляторов и языков? Я предполагаю C.

 Andre Holzner28 сент. 2010 г., 08:27
Я не уверен, что вы много узнаете об операционных системах, написав компилятор ...
 user42739028 сент. 2010 г., 08:30
Спасибо, я не видел другой вопрос, он не появлялся в Google или на SO, когда я искал. Много хороших ответов!
 sbrm101 нояб. 2016 г., 23:10
Я построил язык программирования, не касаясь ассемблера или двоичного кода.github.com/struixLang

Ответы на вопрос(4)

Вы определенно хотите, чтобы это было скомпилировано? Также есть интерпретируемые языки ... или вы можете реализовать компиляцию во время выполнения

Что вы хотите, чтобы целевой платформой была? Некоторые варианты:

Нативный код (какие архитектуры и операционные системы?)JVMОбычный .NET.NET с использованием динамического языка исполнения (например, IronRuby / IronPython)Попугай

Лично я бысильно рассмотрите возможность нацеливания на JVM или .NET, просто потому, что тогда вы получите много «безопасности» бесплатно, а также огромный набор библиотек, которые ваш язык может использовать. (Очевидно, что с нативным кодом есть также много библиотек, но я подозреваю, что правильное взаимодействие между ними может быть сложнее.)

Я не вижу причин, почему выв частности Вы хотите написать компилятор (или другую часть системы) на C, особенно если это только для образовательных целей (поэтому вам не нужен компилятор со скоростью 100 миллионов строк в секунду). На каком языке вы лично наиболее продуктивны?

 user42739028 сент. 2010 г., 08:29
Я могу кодировать на C и C ++. Я предпочитаю C, хотя. В основном я хочу перейти на очень низкий уровень, узнать, как работает компилятор, создаются исполняемые файлы, код загружается в память и выполняется. В конце концов я хочу создать свою собственную крошечную операционную систему со своими небольшими системными / пользовательскими программами. Я не собираюсь ничего делать в больших масштабах, но очень, очень минимально. Я бы работал в основном в Linux и хотел бы, чтобы этот язык использовался в большинстве * nix-систем.

ANTLR, Это потрясающий компилятор-компилятор, который вы используете для создания синтаксического анализатора для языка.

Создание языка - это в основном определение грамматики и добавление правил производства к этой грамматике. Делать это вручную нетривиально, но хороший компилятор-компилятор вам очень поможет.

Возможно, вы также захотите взглянуть на классическую «Книгу Дракона» (книгу о компиляторах, в которой рыцарь убивает дракона на первой странице). (Погугли это).

Создание предметно-ориентированных языков является полезным навыком для овладения. Специфичные для предметной области языки, как правило, не являются полнофункциональным языком программирования, а обычно представляют собой бизнес-правила, сформулированные в специально разработанном для языка языке, разработанном для проекта. Посмотрите на эту тему тоже.

 user42739028 сент. 2010 г., 08:35
Спасибо, что нашел книгу, и ANTLR выглядит очень интересно и экономит время.
 Holstebroe28 сент. 2010 г., 09:01
Если вы хотите погрузиться в парсеры и / или ANTLR, я могу порекомендовать книгу Теренса Парра. Он хорошо разбирается в трудной теме написания парсера.

Напишите себе схему за 48 часов.

Можно начать с «встроенного языка, специфичного для домена» (EDSL). Это язык, который фактически работает в среде другого, но вы создали ключевые слова, операторы и т. Д., Особенно подходящие для предмета (домена), в котором вы хотите работать.

 Hemang11 мая 2017 г., 06:37
Первая ссылка не работает.
Решение Вопроса

Книга Дракона и / илиЯзык программирования прагматика, Это поможет вам в теории языков программирования. Книги охватывают компиляцию и интерпретацию и позволят вам собрать все инструменты, которые понадобятся для создания базового языка программирования.

Я не знаю, сколько вы знаете языка ассемблера, но если вы не достаточно знакомы с некоторым диалектом программирования на ассемблере, я бы посоветовал вам не пытаться писать компилятор, который компилируется в ассемблерный код, так как это немного вызов. Ранее вы упоминали, что знакомы с C и C ++, поэтому, возможно, вы можете написать компилятор, который компилируется до C или C ++, а затем использовать gcc / g ++ или любой другой компилятор C / C ++ для преобразования кода в собственный исполняемый файл. Это то, чтоВала это делает язык программирования (он конвертирует синтаксис Vala в код C, использующий библиотеку GObject).

Что касается того, что вы можете использовать для написания компилятора, у вас есть много вариантов. Вы можете написать это вручную на C или C ++, или, чтобы упростить разработку, вы можете использовать язык более высокого уровня, чтобы вы могли сосредоточиться на написании компилятора больше, чем на выделении памяти и на том, что необходимо для работы со строками в С.

Вы можете просто сгенерировать грамматику и иметьсгибать а такжебизон генерировать парсер и лексический анализатор. Это действительно полезно, поскольку позволяет выполнять итеративную разработку, чтобы быстро получить работающий компилятор.

Другой вариант - использоватьANTLR для создания вашего синтаксического анализатора преимущество заключается в том, что вы получаете множество целевых языков, которые ANTLR может компилировать. Я никогда не использовал это, но я много слышал об этом.

Кроме того, если вы хотите лучше понять модели, которые так часто используются при построении компилятора / сканера / синтаксического анализатора языка программирования, вы должны получить книгу о моделях вычислений. Я бы порекомендовалВведение в теорию вычислений.

Вы также, похоже, проявляете интерес к пониманию операционных систем. Я бы сказал, что это что-то отдельное от дизайна языка программирования и должно осуществляться отдельно. КнигаПринципы современных операционных систем это довольно хорошее начальное место для изучения этого. Вы можете начать с небольших проектов, таких как создание оболочки или написание программы, которая эмулирует команду ls, а затем перейти к более низкоуровневым вещам, в зависимости от того, как вы справляетесь с системными вызовами в C.

Я надеюсь, что это поможет вам.

РЕДАКТИРОВАТЬ: я многому научился, так как я пишу этот ответ. Я бралонлайн курс по языкам программирования тот университет Брауна предлагал, когда я увидел этот ответ, показанный там. Профессор совершенно справедливо отмечает, что в этом ответе много говорится о парсерах, но он освещает практически все остальное. Я бы действительно посоветовал просмотреть видео курса и упражнения, если вы хотите получить лучшее представление о том, как создать язык программирования.

 Varun Madiath24 авг. 2015 г., 00:24
Я взял этот курс онлайн в 2012 году, и думаю, что это был отличный курс. :)
 user42739028 сент. 2010 г., 14:23
Спасибо, действительно проницательный пост! Я наверняка посмотрю все, отличный пост!
 agam10 авг. 2015 г., 22:15
(Поскольку кто-то должен указать на это в конце концов ...) этот ответ достиг некоторого уровняyoutube.com/watch?v=3N__tvmZrzc
 Varun Madiath30 сент. 2010 г., 04:47
Спасибо за пометку этого правильного ответа. К тому времени, когда я все напечатал, чужой ответ уже был отмечен правильно. Это первый ответ, который я разместил на этом сайте, который был принят.

Ваш ответ на вопрос