Я давно читал серию постов одного очень грамотного товарища по поводу его опыта создания и реализации ЯП (компилятор, виртуальная машина, весь сопутствующий инструментарий). Потом потерял ссылку на это вот богатство. Теперь вот снова нашел и спешу поделиться, может кому-то полезно будет.
Для затравки пара цитат:
Сам компилятор написан на Окамле - ~1700 строк. При этом он вдоль и поперек неправильный. Как обычно компилируют подобные языки? Берется генератор парсеров, вроде яка, бизона или муравлера, им разбирают текст. Типы или заставляют описывать явно, или делают их вывод имени Хайнекен-Миллера Хиндли-Милнера. Для ФВП делают или первоклассные функции и замыкания, с представлением функций парой указатель-данные, или хотя бы объекты с виртуальными функциями. Для автоматического управления памятью делают сборку мусора или хотя бы подсчет ссылок. Для генерации кода используют промежуточное представление SSA. ВМ делают стековую или, реже, регистровую... Ничего этого у меня нет. А что есть вместо - расскажу в следующих постах.
Почти все классические книжки и курсы по компиляторостроению начинаются с приемов разбора текста. И, я смотрю, многие разработчики тоже начинают писать свои компиляторы с парсинга. Не делайте этого! Это имеет смысл, только если разбираемый язык дан свыше каким-нибудь уважаемым божеством, а жрецы уже написали к нему сутры, шастры и кандидатские диссертации с комментариями. В противном случае дизайн языка начинает подчиняться ограничениям используемых инструментов парсинга, а сформулировать нормально грамматику становится очень сложно. Да и в выборе инструментов легко ошибиться. Вот вам мой совет: сперва опишите язык в виде структуры данных (алгебраического типа, например), реализуйте логику самого компилятора (в процессе структура может не раз поменяться), и лишь потом из нее уже делайте текст, перевод такой структуры в грамматику уже прост и линеен.
Пишем неправильный компилятор. Часть 0Часть 1. Як, слон и древесная крысаЧасть 2. Иллюзорный автомобильЧасть 3. Первые шагиЧасть 4. ФВП, полиморфизм и вывод типов без матанаСтруктуры, рефакторинг.ОптимизацияFun with Leo: metaprogramming for free