Вопрос

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

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

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


Вариации на этот вопрос задавались неоднократно, еще Учимся писать компилятор. Вот неполный список ресурсов SO. по теме.

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

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

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

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

Также...

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

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

  

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

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

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

На любые вопросы о компиляторах будет ответ &: иди, прочитай книгу драконов, прочитай эту книгу, эту книгу ... " на ТА независимо от их содержания за несколько минут. Поэтому я пропускаю эту часть (как я говорил в первую очередь). Чтение этих книг, чтобы узнать, как использовать инструменты, которые вы хотите, примерно так же полезно, как чтение об угловых моментах, чтобы научиться ездить на велосипеде.

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

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

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

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

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

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

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

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

Доступно много книг. Одной из моих любимых книг была книга BYTE: «Языки с толкованием в переводе».

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

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

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

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

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

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

Удачи

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top