Первая часть читается в весеннем семестре на третьем курсе бакалавриата МФТИ и ВШЭ, и первом курсе магистратуры ВШЭ. Вторая часть курса читается в осеннем семестре на четвертом курсе бакалавриата МФТИ.
Преподаватели: к.ф.-м.н. Гайсарян Сергей Суренович, Мельник Дмитрий Михайлович.
Цель курса — освоение основных принципов построения современных оптимизирующих компиляторов, причем основное внимание уделяется именно оптимизации кода — начиная от генерации внутреннего представления программы, анализа потока данных, различных этапов анализа и оптимизации кода, и заканчивая распределением регистров для конкретной целевой архитектуры и генерации для нее машинного кода. В ходе курса подробно рассматриваются алгоритмы компиляторных оптимизаций, а также разбираются примеры их работы. Рассматриваемые в курсе алгоритмы составляют основу оптимизаций, применяемых в современных промышленных компиляторах, таких как Clang/LLVM и GCC.
Рассматриваемые темы в первой части курса:
- Грамматики, парсеры, фронтенд.
- Введение, базовые блоки, локальные оптимизации.
- Построение множеств Input и Output.
- Анализ потока данных.
- Доминаторы и постдоминаторы.
- Машинно-независимая оптимизация.
- SSA-форма.
- Распространение констант.
- Глобальная нумерация значений.
- Анализ на основе областей.
Рассматриваемые темы во второй части курса:
- Введение и архитектура ARM.
- Выбор команд.
- Распределение и назначение регистров.
- Планирование кода.
- Программная конвейеризация.
- Динамическая компиляция.