Проекты

Проекты выполняются в течении всего курса и сдаются в конце. В некоторых проектах возможна командная работа — об этом написано явно в спецификации. Ссылки на спецификации проектов ниже.

Превью
Проект: компилятор процедурного языка
Превью
Проект: интерпретатор языка PostScript для 2D графики

Обзорные статьи

Превью
Книги и материалы по разработке компиляторов
Превью
А что такое Compiler Driver?
А что такое Compiler Frontend?
А что такое Compiler Backend?

Compiler Frontend, основы

Превью
Конечные автоматы
Превью
Грамматики
Превью
Калькулятор на основе рекурсивного спуска
Abstract Syntax Tree Сердце современных фронтендов компиляторов — абстрактное синтаксическое дерево (Abstract Syntax Tree, AST). Оно создаётся на стадии синтаксического разбора, обрабатывается путём обхода при проверке семантических правил и проверке/определении типов, а затем также путём обхода AST выполняется генерация кода.
Восходящий разбор по принципу сдвига и свёртки (shift-reduce)
Полезные утилиты из STL и Boost для фронтенда

Compiler Backend & Driver, основы

Превью
Стековые и регистровые машины
Исследуем работу компилятора C/C++
FFI - механизм интеграции между языками программирования
Автоматизируем вызов graphviz из командной строки

Лексический и синтаксический анализ

Превью
Изучаем генератор кода 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, который затем можно скомпилировать вручную.

C/C++

Особенности языка C и C-style кода