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

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

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

Я думал, что могу сгенерировать код на С++ и выполнить компиляцию gcc. Используя вышеприведенные инструменты, как долго вы оцениваете это, потребуется написать программу или script язык?


Вариации по этому вопросу неоднократно задавались еще в Обучение написанию компилятора. Ниже приведен неполный список SO-ресурсов по этой теме.

Ответы

Ответ 1

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

Однако не позволяйте этому отговаривать вас. Как Джефф и Джоэл обсуждали с Эриком Синком на недавнем подкасте Stack Overflow, написать компилятор - отличный способ узнать о многих различных аспектах программирования. Я создал несколько компиляторов, и они являются одними из самых запоминающихся программных проектов.

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

Ответ 2

Дэйв Хэнсон, который с Крисом Фрейзером потратил 10 лет на создание одного из самых тщательно продуманных компиляторов мира, сказал мне однажды, что один из главных вещи, которые он извлек из опыта, заключались не в том, чтобы попытаться написать компилятор на C или С++.

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

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

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

Ответ 3

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

"Принципы проектирования компиляторов" Альфреда В. Ахо и Джеффри Д. Ульмана. Это было довольно давно, и его розовый рыцарь и зеленый дракон хорошо известны, по крайней мере, нескольким поколениям учеников CS.

Также...

"Компиляторы: принципы, методы и инструменты" Альфреда В. Ахо, Моники С. Лам, Рави Сети, Джеффри Д. Ульмана

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

Ответ 4

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

Не делай этого. (Или, по крайней мере, думать долго и трудно, прежде чем делать!)

Если вы пытаетесь написать язык сценариев, чтобы разоблачить методы/свойства некоторых пользовательских объектов, было бы лучше реализовать их в Java (или .NET/VB или все эти нежные Microsoftism), а затем использовать один из Bean Scripting Framework в качестве языка сценариев. (с любым эквивалентом на конце Microsoft.)

Ответ 5

Любые вопросы о компиляторах будут иметь ответ "идти читать книгу драконов, читать эту книгу, эту книгу..." на SO независимо от их содержания через несколько минут. Поэтому я пропущу эту часть (как я говорил в первую очередь). Чтение этих книг, чтобы узнать, как использовать нужные вам инструменты, примерно так же полезно, как чтение о импульсе angular, чтобы узнать, как кататься на велосипеде.

Итак, чтобы ответить на то, что вы просили, не подвергая сомнению ваше намерение, я могу с легкостью рекомендовать antlr и antlrworks для начинающих. Вы можете легко сгенерировать свой АСТ (где, по-моему, происходит настоящая магия) и визуально отлаживать вашу грамматику. Он создает для вас значительную часть рабочего компилятора.

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

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

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

Ответ 6

Я думаю, что у всех отсутствует один очень важный момент.

ПОЧЕМУ вы хотите написать компилятор/интерпретатор/парсер и т.д.

Это серьезно определит, что вы делаете.

Я работал над довольно многими языковыми реализациями, некоторые довольно странные, некоторые специфичные для домена, некоторые просто выполняли скриптовый прогресс через командные среды (часто там, где среда команд была позже скрыта). Каждый из них требует разных уровней мастерства.

Доступны многие книги. Одной из моих любимых была книга BYTE: "Потоколированные языки" - поставил ее на печать.

Простые двигатели script могут быть созданы с помощью нескольких вечерних размышлений и немного проб и ошибок.

Но я уверен, что сейчас онлайн-курсы помогут вам сэкономить массу времени.

Ответ 7

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

Ответ 8

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

Ответ 9

Хорошим инструментом, который я использовал для LALR, является GOLD Parsing System. Это бесплатно, грамматик - это форма Бэксу-Наура, и есть несколько примеров, включая движки, написанные на С#, VB.NET, Java и другие. Это позволяет писать грамматик, компилировать грамматик в файл, а затем использовать движок для анализа грамматика.

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

Удача

Ответ 10

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

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