Компилятор языка O, часть 0

Компилятор языка O, часть 0

Виталий

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

Так же в книге довольно много места уделяется парсерам, что на мой взгляд довольно сильно уводит фокус именно на хорошо изученную часть компиляторов, которая объясняется практически в любом учебнике по компиляторам.

Было решено взять интересные куски и не брать неинтересные и описать процесс разработки компилятора для языка О через призму того, как я бы сам хотел видеть учебное пособие подобного рода.

Процесс будет идти как бы "наоборот" по сравнению с тем, что даётся в книге:

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

Итак. Анонс сделан. Следите за следующими публикациями (если интересно, конечно)

Report Page