|
В спецкурсе рассматривается круг вопросов, связанных с анализом и оптимизацией программ на императивных языках высокого уровня. Оптимизирующие проходы являются важнейшей и наиболее трудоемкой частью современных компиляторов с языков высокого уровня. В спецкурсе основное внимание уделено классическим алгоритмам, используемым при оптимизации программ, а так же дается введение в актуальные на текущий момент сферы исследований в данной области.
В спецкурсе рассматриваются следующие вопросы:
Структура компилятора. Виды промежуточных представлений программы, используемые при оптимизации. Место оптимизационных фаз в структуре компилятора.
Анализ потока управления. Структурный анализ. Выделение циклов.
Итерационные методы анализа потока данных. Уравнение потока. Сходимость. Задача о достигающих определениях.
Локальное и глобальное устранение общих подвыражений.
Вынос инвариантов из цикла. Уменьшение сложности (strength reduction) индуктивных выражений.
Представление программы со статически однократным присваиванием (SSA). Перевод из регулярного представления в SSA и обратно.
Продвижение констант и копий в SSA-представлении. Устранение мёртвого кода в SSA-представлении.
Анализ указателей (alias analysis).
Анализ интервалов жизни переменных. Устранение мёртвого кода. Глобальное распределение регистров методом раскраски графа.
Понятие локальности. Оптимизации, повышающие локальность.
Планирование инструкций (instruction scheduling).
Полустатический (profile-based) анализ и оптимизация программ. Перегруппировка базовых блоков.
Динамическая оптимизация программ. Just-in-time компиляторы.
Литература:
А. Ахо, М. Лам, Р. Сети, Д. Ульман. Компиляторы: принципы, технологии, инструменты. Вильямс, 2008.
R. Allen, K. Kennedy. Optimizing Compilers for Modern Architectures. Morgan Kaufmann Publishers, 2002.
A. Appel. Modern Compiler Implementation in C. Cambridge University Press, 1998.
S. Muchnick. Advanced Compiler Design and Implementation. Morgan Kaufmann Publishers, 1997.
|