Разработка компиляторов

       

Стадии оптимизации


Проведение оптимизирующего преобразования обычно осуществляется в несколько стадий. Рассмотрим каждую из них на конкретном примере.

  • Фрагментация. Под фрагментацией понимается выделение некоторого участка программы, к которому может быть применено преобразование. В данном случае таким участком является последовательность операторов, один из которых - условный оператор без части else. Задачу фрагментации решает анализ потока управления. Заметим, что различные оптимизирующие преобразования требуют выделения различных фрагментов исходной программы, так что количество задач фрагментации достаточно велико. Некоторые алгоритмы фрагментации подробнее рассмотрены в лекции 12.
  • Проверка контекстных условий, то есть выяснение применимости оптимизирующего преобразования к данному фрагменту. В данном случае необходимо проверить, что значение переменной a после первого присваивания фрагмента не используется в случае ложности условия p(x) . Задачи такого рода решаются с применением анализа потоков данных. Примеры задач анализа потоков данных и описание общего подхода к их решению приведены в лекции 13.
  • Преобразование. Собственно применение оптимизации к выбранному фрагменту. В данном случае первое присваивание "втянуто" в then-часть условного оператора. Таким образом, в случае ложности условия p(x) программа выполняет на один оператор меньше.



Содержание раздела