Предложения для записи языка программирования? [закрытый]

9 ответов

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

Однако не позволяют этому обескуражить Вас. Поскольку Jeff и Joel обсуждали с Eric Sink на недавний подкаст Переполнения стека , пишущий, что компилятор является отличным способом узнать о многих различных аспектах программирования. Я создал несколько компиляторов, и они среди моих самых незабываемых проектов программирования.

Некоторые классические книги по созданию компиляторов:

18
ответ дан 30 November 2019 в 16:30
поделиться

Dave Hanson, который с Chris Fraser провел 10 лет, создавая один из наиболее тщательно созданных компиляторов в мире , сказал мне однажды, что одно из главного, которое он извлек из опыта, не состояло в том, чтобы попытаться записать компилятор в C или C++.

, Если Вы хотите разработать что-то быстро, не генерируйте собственный код; будьте нацелены на существующую виртуальную машину, такую как CLR, JVM, или виртуальная машина Lua . Сгенерируйте код, использующий максимальный, жуют.

Другой хороший вариант, если Вы пишете интерпретатор, состоит в том, чтобы только использовать управление памятью и другие средства Вашего базового языка программирования. Синтаксический анализ к AST и затем интерпретирует обходом дерева AST. Это успешно начнет Вас быстро. Производительность не является самой большой, но это приемлемо. (Используя эту технику я однажды записал интерпретатор PostScript в Modula-3. Первая реализация заняла неделю и хотя она позже подверглась некоторой настройке производительности, прежде всего, в лексическом анализаторе, она никогда не должна была заменяться.)

Избегают генераторов LALR-парсера; используйте что-то, что экономит Ваше время, как ANTLR или генератор Elkhound GLR парсера.

5
ответ дан 30 November 2019 в 16:30
поделиться

Классические книги по дизайну компилятора

"Принципы Дизайна Компилятора" Alfred V. Aho и Jeffrey D. Ullman. Это было в некоторое время теперь, и его розовый рыцарь и зеленый дракон известны по крайней мере нескольким поколениям студентов CS.

Также...

"Компиляторы: Принципы, Методы и Инструменты" Alfred V. Aho, Monica S. Lam, Ravi Sethi, Jeffrey D. Ullman

, Если Вам интересно в письменной форме компилятор затем, это, несомненно, лучшие места для запуска.

3
ответ дан 30 November 2019 в 16:30
поделиться

Как человек, который знает C++ очень хорошо, какие подсказки можно дать человеку, который надеется писать язык сценария или программирование?

не делают этого. (или, по крайней мере, хорошо подумайте, прежде чем Вы сделаете!)

, Если бы Вы пытаетесь записать язык сценариев для представления методов/свойств некоторых пользовательски записанных объектов, было бы лучше реализовать тех, которые в Java (или.NET/VB или все те неприглядные Microsoftisms) и затем использовать один из Бобовая Платформа Сценариев языки как язык сценариев. (с чем эквивалент находится на конце Microsoft.)

3
ответ дан 30 November 2019 в 16:30
поделиться

Любые вопросы о компиляторах будут иметь ответ, "идут книга дракона чтения, читают ту книгу, эту книгу..." по ТАК независимо от их содержания за несколько минут. Таким образом, я пропускаю ту часть (как, я говорил во-первых). Чтение этих книг, чтобы изучить, как использовать инструменты, которые Вы хотите, почти так же полезно как читающий об угловом моменте, чтобы изучить, как ездить на велосипеде.

Так, для ответа, что Вы спросили, не подвергая сомнению Ваше намерение, я могу легко рекомендовать antlr и antlrworks для начинающих. Можно генерировать AST легко (где реальное волшебство происходит, я думаю), и отладьте грамматику визуально. Это генерирует хорошую часть рабочего компилятора для Вас.

, Если Вы знаете свой материал и хотите иметь больше контроля или не любят antlr, можно использовать лимон парсер-генератор, и компилятор конечного автомата ragel (имейте специальную поддержку lexing), вместе.

, Если Вам не нужно слишком много производительности и так как Вы планируете сгенерировать код C/C++, можно пропустить выполнение любой оптимизации сами и отпуска, которые наполняют к компилятору C/C++.

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

3
ответ дан 30 November 2019 в 16:30
поделиться

Я настоятельно рекомендовал бы смотреть на существующие интерпретаторы байт-кода. Если можно заставить язык вписаться в CIL (.NET) или Java (или даже другие, такие как Python или Попугай), Вы сохраните себя все усилие по созданию осуществимой среды поддержки и можете продолжить экспериментирование с понятиями языка.

2
ответ дан 30 November 2019 в 16:30
поделиться

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

1
ответ дан 30 November 2019 в 16:30
поделиться

Хороший инструмент, который я использовал для LALR, ЗОЛОТАЯ Система Парсинга . Это свободно, grammer является Форма Бэкуса-Наура, и существует несколько примеров, включая механизмы, записанные в C#, VB.NET, Java и других. Это позволяет Вам записать grammer, скомпилировать grammer в файл и затем использовать механизм для парсинга grammer.

, Как рекомендуется выше, я рекомендовал бы быть нацеленным на код байта некоторого вида, как IL. Это позволит Вам усиливать огромные суммы существующих платформ.

Удачи

1
ответ дан 30 November 2019 в 16:30
поделиться

Если Вы не хотите входить в запись компилятора для сокращения языка до блока/машины, то следующая опция состоит в том, чтобы записать компилятор в виртуальную машину языка байт-кода, такую как JVM, PVM или.NET.

, Конечно, если бы Вы даже не хотите делать это - Вы просто хотите создать свой собственный "предметно-ориентированный язык", я создал бы его в языке Common LISP. Макросы Lisp предоставляют довольно простой метод создания безотносительно синтаксиса, который Вы хотите и парсинг его в Lisp. И у Вас нет беспокойства о байт-коде или блоке. Конечно, необходимо изучить Lisp.

0
ответ дан 30 November 2019 в 16:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: