Как создать язык в эти дни? - PullRequest
       46

Как создать язык в эти дни?

9 голосов
/ 11 октября 2009

Мне нужно приступить к написанию того языка программирования, который я хотел написать. Как вы, дети, делаете это в эти дни? Я был вне цикла более десяти лет; Вы делаете это иначе, чем мы делали еще до Интернета, до Windows? Вы знаете, когда «настоящие» кодеры кодировали на C, использовали командную строку и обсуждали, какая оболочка была лучше?

Просто, чтобы уточнить, я имею в виду, не как вы ДИЗАЙН язык (который я могу понять довольно легко), а как вы строите компилятор и стандартные библиотеки и так далее? Какие инструменты вы, дети, используете в эти дни?

Ответы [ 19 ]

1 голос
/ 31 октября 2009

Просто чтобы уточнить, я имею в виду, а не как вы ДИЗАЙН язык (который я могу понять довольно легко)

Просто подсказка: сначала посмотрите на несколько различных языков, прежде чем создавать новый язык (то есть языки с совершенно другой стратегией оценки). Haskell и Oz приходят на ум. Хотя вы также должны знать Пролог и Схему. Год назад я тоже говорил «эй, давайте спроектируем язык, который ведет себя именно так, как я хочу», но, к счастью, я сначала посмотрел на эти другие языки (или вы могли бы также сказать к сожалению , потому что теперь я не не знаю, как я хочу, чтобы язык больше себя вел ...).

0 голосов
/ 11 августа 2011

Существует большой путь к реализации языка, которого я не вижу в других ответах здесь. Если вы используете одну из «неперфорированных» форм Лукасевича (например, Forward Polish или Reverse Polish), вам вообще не нужен анализатор! При обратной полировке зависимости переходят справа налево, поэтому вы просто выполняете каждый токен во время его сканирования. С прямой полировкой все наоборот, так что вы фактически выполняете программу «назад», упрощая подвыражения до достижения начального токена.

Чтобы понять, почему это работает, вы должны исследовать 3 основных алгоритма обхода дерева: предварительный порядок, порядок, пост-порядок. Эти три обхода являются противоположностью задачи синтаксического анализа, которую должен выполнить читатель языка (т.е. парсер). Только нотация в порядке «требует» рекурсивного примитива для восстановления дерева выражений. С двумя другими вы можете получить только стек.

Это может потребовать больше «мышления» и меньше «реализации».

Кстати, если вы уже нашли ответ (этому вопросу год), вы можете опубликовать его и принять его.

0 голосов
/ 12 ноября 2010

Если вы хотите написать компилятор, очевидно, вам нужно прочитать Книгу Дракона;)

Вот еще одна хорошая книга, которую я только что прочитал. Это практично и легче понять, чем Книга Дракона:

http://www.amazon.co.uk/s/ref=nb_sb_noss?url=search-alias%3Daps&field-keywords=language+implementation+patterns&x=0&y=0

0 голосов
/ 07 ноября 2010

Используйте bison / flex, который является версией gnu для yacc / lex. Эта книга чрезвычайно полезна .

Причина использования зубров в том, что он улавливает любые конфликты в языке. Я использовал это, и это сделало мою жизнь намного легче (хорошо, так что я на втором курсе, но первые 6 месяцев были несколько лет назад, когда я писал его на C ++, и анализ / конфликты / результаты были ужасны!: (.) ​​

0 голосов
/ 24 октября 2009

Конечно, более старые методы все еще распространены (например, с использованием Flex и Bison), во многих новых реализациях языка сочетаются фазы лексизации и синтаксического анализа с использованием синтаксического анализатора, основанного на грамматике синтаксического анализа выражения (PEG). Это работает для парсеров с рекурсивным спуском, созданных с помощью комбинаторов или запоминающих парсеры Packrat. Многие компиляторы также создаются с использованием инфраструктуры Antlr.

0 голосов
/ 15 октября 2009

Майк -

Если вы заинтересованы в эффективном компиляторе, генерирующем собственный код для Windows, чтобы вы могли ориентироваться - не разбираясь со всеми ненужными виджетами, гаджетами и прочей ерундой, которая загромождает современные машины - я рекомендую Osmosian Заказать систему разработки на простом английском языке. Он включает в себя уникальный интерфейс, упрощенный файловый менеджер, удобный текстовый редактор, удобный шестнадцатеричный дампер, компилятор / компоновщик (конечно) и приложение для разметки страниц wysiwyg для документации. Написанная полностью на простом английском языке, это быстрая загрузка (менее мегабайта), достаточно небольшая, чтобы ее можно было понять в короткие сроки (около 25 000 строк кода на простом английском языке, всего лишь 4 000 в компиляторе / компоновщике), но при этом достаточно мощная, чтобы воспроизводить себя в нижней части Dell менее чем за три секунды. На самом деле: три секунды. И это бесплатно для всех, кто пишет и просит копию, включая исходный код и довольно смешное 100-страничное руководство. См. Www.osmosian.com для получения подробной информации о том, как получить копию, или напишите мне напрямую с вопросами или комментариями: Gerry.Rzeppa@pobox.com

0 голосов
/ 11 октября 2009

Не простой ответ, но ..

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

http://www.mactech.com/articles/mactech/Vol.16/16.07/UsingFlexandBison/

Люди могут потратить на это годы. В вышеприведенной статье рассказывается об использовании двух инструментов (Flex и Bison), которые можно использовать для преобразования текста в код, который можно передать компилятору.

0 голосов
/ 11 октября 2009

Реальные кодеры до сих пор кодируют на C. Просто это немного острее.
Хм ... язык дизайна? или написание компилятора? Если вы хотите написать компилятор, вы должны использовать Flex + Bison. (Google)

0 голосов
/ 11 октября 2009

Сначала я потратил год или около того, чтобы действительно подумать, как должен выглядеть язык. В то же время я помогал в разработке Ioke (www.ioke.org) для изучения внутренних языков.

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

Поскольку мой язык прост на синтаксическом уровне (без ключевых слов, только литералы, операторы и сообщения), я мог бы использовать Ragel (http://www.complang.org/ragel/) для построения сканера. Он быстрый, как ад и простой в использовании.

Теперь у меня есть рабочая модель объекта, сканер и простой перетасовка операторов, а также стандартный код начальной загрузки библиотеки. Я даже могу запускать простые программы - если они помещаются в один файл:)

...