Обзор курса
Курс состоит из лекций, семинаров и лабораторных работ.
Темы лекций
- Введение в компиляцию. Структура компилятора. Процесс компиляции.
- Классификация языков программирования
- Лексический анализ. Токены, шаблоны, лексемы. Языки
- Регулярные выражения. Распознавание шаблонов на основе недетерминированного конечного автомата
- Переход от недетерминированного к детерминированному конечному автомату
- Производные регулярных выражений Януша Бржозовски
- Синтаксический анализ. Понятие и роль синтаксического анализа
- Грамматики. Иерархия Хомского. Форма Бэкуса-Наура
- Нисходящий синтаксический анализ. Рекурсивный анализ
- Предиктивный анализ. LL(1)-анализ
- Восходящий синтаксический анализ. Метод перенос/свертка. LR-анализ
- Промежуточный код. Ориентированные ациклические графы. Трёхадресный код
- Выражения типов. Эквивалентность типов. Синтез и выведение. Проверка
- Машинно-независимая оптимизация. Источники оптимизации. Семантически-эквивалентные трансформации
- Организация памяти. Доступ к нелокальным данным. Управление кучей
- Генерация целевого кода. Распределение регистров. Адресация в целевом коде
- Локальная оптимизация. Параллелизм уровня команд. Конвейеризация. Оптимизация локальности
Лабораторные работы
- Лексический анализ
- Синтаксически анализ методом рекурсивного спуска
- Генераторы анализаторов
- Проверка типов
- Генерация трёхадресного кода
- Оптимизация трёхадресного кода
- Использование инструмента LLVM
Материалы
Исходные коды демонстраций доступны по адресу
- https://github.com/lierdakil/compilers-course – Java + ANTLR4
- https://github.com/lierdakil/compilers-course2 – C++
- https://github.com/lierdakil/compilers-course3 – Haskell и C++
Демонстрация работы различных парсеров (реализованных в виде автоматов с магазинной памятью) доступна по адресу https://lierdakil.github.io/parser-demo/index.html
Литература
- Альфред В. Ахо, Моника С. Лам, Рави Сети, Джеффри Д. Ульман. Компиляторы: принципы, технологии и инструментарий = Compilers: Principles, Techniques, and Tools. — 2 изд. — М.: Вильямс, 2008. — ISBN 978-5-8459-1349-4.
- Бенжамин Пирс. Типы в языках программирования. M.: “Лямбда-пресс”: “Добросвет”, 2014.