Первая часть читается в весеннем семестре на третьем курсе бакалавриата МФТИ и ВШЭ, и первом курсе магистратуры ВШЭ. Вторая часть курса читается в осеннем семестре на четвертом курсе бакалавриата МФТИ.

Преподаватели: к.ф.-м.н. Гайсарян Сергей Суренович, Мельник Дмитрий Михайлович.

Цель курса — освоение основных принципов построения современных оптимизирующих компиляторов, причем основное внимание уделяется именно оптимизации кода — начиная от генерации внутреннего представления программы, анализа потока данных, различных этапов анализа и оптимизации кода, и заканчивая распределением регистров для конкретной целевой архитектуры и генерации для нее машинного кода. В ходе курса подробно рассматриваются алгоритмы компиляторных оптимизаций, а также разбираются примеры их работы. Рассматриваемые в курсе алгоритмы составляют основу оптимизаций, применяемых в современных промышленных компиляторах, таких как Clang/LLVM и GCC.

Рассматриваемые темы в первой части курса:

  1. Грамматики, парсеры, фронтенд.
  2. Введение, базовые блоки, локальные оптимизации.
  3. Построение множеств Input и Output.
  4. Анализ потока данных.
  5. Доминаторы и постдоминаторы.
  6. Машинно-независимая оптимизация.
  7. SSA-форма.
  8. Распространение констант.
  9. Глобальная нумерация значений.
  10. Анализ на основе областей.

Рассматриваемые темы во второй части курса:

  1. Введение и архитектура ARM.
  2. Выбор команд.
  3. Распределение и назначение регистров.
  4. Планирование кода.
  5. Программная конвейеризация.
  6. Динамическая компиляция.