Теория компиляции
Проекты
Проекты выполняются в течении всего курса и сдаются в конце. В некоторых проектах возможна командная работа — об этом написано явно в спецификации. Ссылки на спецификации проектов ниже.
Обзорные статьи
Compiler Frontend, основы
Abstract Syntax Tree
Сердце современных фронтендов компиляторов — абстрактное синтаксическое дерево (Abstract Syntax Tree, AST). Оно создаётся на стадии синтаксического разбора, обрабатывается путём обхода при проверке семантических правил и проверке/определении типов, а затем также путём обхода AST выполняется генерация кода.
Compiler Backend & Driver, основы
Лексический и синтаксический анализ
Изучаем генератор кода GNU Flex
GNU Flex позволяет описать лексический анализатор на простом языке Flex, перечислив регулярные выражения для отдельных токенов и указав код, исполняемый при сопоставлении каждого токена. Затем Flex генерирует код на языке C или C++. Полученный код использует детерминированный конечный автомат для разбора текста.
Руководство по lexertl
C++ библиотека lexertl во многом лучше GNU Flex. Она умеет создавать лексические анализаторы из правил в runtime, может обрабатывать unicode, и даже умеет генерировать код сканера на C++. Библиотека header-only и очень проста в установке.
Руководство по Bison
GNU Bison позволяет описать грамматику парсера на языке, похожем на EBNF. Получив на вход грамматику, Bison способен сгенерировать код парсера на C/C++. Полученный код использует таблицы переходов и недетерминированный конечный автомат со стеком.
Руководство по Lemon
Lemon появился, когда разработчиков SQLite не устроил код, сгенерированный GNU Bison. Генератор парсеров Lemon создаёт более чистый и простой парсер, который лучше обрабатывает переполнение стека и другие исключительные случаи, более удобен в многопоточной и объектно-ориентированной средах.
Frontend, продвинутый уровень
Примеры ко всем статьям ищите в репозитории примеров в каталоге chapter_3
Backend, продвинутый уровень
Изучаем LLVM, виртуальный ассемблер LLVM-IR, генерируем машинный код. Все примеры в этой серии статей основаны на C++14, генераторе кода Lemon или библиотеках проекта LLVM.
Руководство по установке LLVM
Руководство по сборке и установке LLVM на Windows и Linux. Знакомит с примерами и утилитами в составе LLVM.
Архитектура Backend компилятора
Статья рассматривает архитектуру бекенда и связывает понятия Abstract Syntax Tree, "промежуточный код" и "машинный код".
Минимальный транслятор, основанный на LLVM
В данной статье описан пример минимального компилятора, бекенд которого основан на LLVM. Транслятор умеет превращать исходный код с функциями и выражениями в промежуточный код на языке LLVM-IR, который затем можно скомпилировать вручную.