Oberon space

General Category => Общий раздел => Тема начата: valexey от Октябрь 15, 2011, 07:52:01 pm

Название: Опыт создания ЯП.
Отправлено: valexey от Октябрь 15, 2011, 07:52:01 pm
Я давно читал серию постов одного очень грамотного товарища по поводу его опыта создания и реализации ЯП (компилятор, виртуальная машина, весь сопутствующий инструментарий). Потом потерял ссылку на это вот богатство. Теперь вот снова нашел и спешу поделиться, может кому-то полезно будет.

Для затравки пара цитат:

Цитировать
Сам компилятор написан на Окамле - ~1700 строк. При этом он вдоль и поперек неправильный. Как обычно компилируют подобные языки? Берется генератор парсеров, вроде яка, бизона или муравлера, им разбирают текст. Типы или заставляют описывать явно, или делают их вывод имени Хайнекен-Миллера Хиндли-Милнера. Для ФВП делают или первоклассные функции и замыкания, с представлением функций парой указатель-данные, или хотя бы объекты с виртуальными функциями. Для автоматического управления памятью делают сборку мусора или хотя бы подсчет ссылок. Для генерации кода используют промежуточное представление SSA. ВМ делают стековую или, реже, регистровую... Ничего этого у меня нет. А что есть вместо  - расскажу в следующих постах.

Цитировать
Почти все классические книжки и курсы по компиляторостроению начинаются с приемов разбора текста. И, я смотрю, многие разработчики тоже начинают писать свои компиляторы с парсинга. Не делайте этого! Это имеет смысл, только если разбираемый язык дан свыше каким-нибудь уважаемым божеством, а жрецы уже написали к нему сутры, шастры и кандидатские диссертации с комментариями. В противном случае дизайн языка начинает подчиняться ограничениям используемых инструментов парсинга, а сформулировать нормально грамматику становится очень сложно. Да и в выборе инструментов легко ошибиться. Вот вам мой совет: сперва опишите язык в виде структуры данных (алгебраического типа, например), реализуйте логику самого компилятора (в процессе структура может не раз поменяться), и лишь потом из нее уже делайте текст, перевод такой структуры в грамматику уже прост и линеен.

Пишем неправильный компилятор. Часть 0 (http://thedeemon.livejournal.com/9712.html)
Часть 1. Як, слон и древесная крыса (http://thedeemon.livejournal.com/9974.html)
Часть 2. Иллюзорный автомобиль (http://thedeemon.livejournal.com/10126.html)
Часть 3. Первые шаги (http://thedeemon.livejournal.com/10315.html)
Часть 4. ФВП, полиморфизм и вывод типов без матана (http://thedeemon.livejournal.com/10819.html)
Структуры, рефакторинг. (http://thedeemon.livejournal.com/12367.html)
Оптимизация (http://thedeemon.livejournal.com/12731.html)
Fun with Leo: metaprogramming for free (http://thedeemon.livejournal.com/12899.html)