Компилятор языка O, часть 0
Виталий
В последнее время я читаю много литературы по компиляторам. Одна из книжек это Языки программирования и методы трансляции Сергея Залмановича Свердлова. В книге довольно много времени уделено истории языков программирования, в частности наследников алгола таких как Паскаль, Модула-2, Оберон. В качестве языка программирования для учебного компилятора выбран язык О, который можно описать как этакий минималистичный subset Паскаля, Модулы и Оберона. Некоторые решения мне не очень понравились. В частности, не особо интересно писать однопроходный компилятор на паскале. Зато мне очень понравилась идея сделать стековую виртуальную машину и компилировать язык в её байткод.
Так же в книге довольно много места уделяется парсерам, что на мой взгляд довольно сильно уводит фокус именно на хорошо изученную часть компиляторов, которая объясняется практически в любом учебнике по компиляторам.
Было решено взять интересные куски и не брать неинтересные и описать процесс разработки компилятора для языка О через призму того, как я бы сам хотел видеть учебное пособие подобного рода.

Процесс будет идти как бы "наоборот" по сравнению с тем, что даётся в книге:
- Сначала я опишу и реализую стековую виртуальную машину (язык реализации будет Rust), в байткод которой и планируется компиляция. Реализация будет сопровождаться набором тестов, причём в том числе с реализациями нескольких классических алгоритмов
- Далее будет описан сам язык О и его абстрактное синтаксическое дерево и написан определительный интерпретатор, который определяет семантику данного языка. Так же будут написаны тесты, которые во многом по структуре своей будут повторять те, что написаны для виртуальной машины
- Далее будет выстроен мостик из нескольких проходов, каждый из которых будет преобразовывать изначальное абстрактное синтаксическое дерево в промежуточные представления, постепенно приближающиеся к итоговому байткоду, в который производится компиляция. Для каждого прохода как всегда будет написан тестовый набор.
- Когда все проходы будут реализованы, тесты написаны и баги устранены, самое время будет написать парсер. Синтаксис я намеренно изменю на "лиспоподобный", так как хочется сделать акцент на том, что суть данной серии постов не в парсинге, а именно в написании полноценного компилятора, и в том, до чего обычно не доходит ни один одухотворённый начинатель своего компилятора.
Итак. Анонс сделан. Следите за следующими публикациями (если интересно, конечно)