Распространение констант

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

Пример

Вид на уровне кода

До оптимизации:

def main() -> None:
    x: int = 1
         y: int = 2
    z: int = x + y

После оптимизации:

def main() -> None:
    x: int = 1
         y: int = 2
    z: int = 1 + 2

Вид на уровне синтаксических деревьев

Для реализации оптимизации, необходимо:

  • определять «изменяемость» переменной (контролируется полем, содержащимся в таблице символов);

  • сохранить значения «неизменяемых» переменных (используется структура данных, хранящая значения для каждой переменной в своей области видимости);

Алгоритм заключается в том, что при рекурсивном проходе дерева анализируются переменные, входящие в состав выражений, для которых параметр «неизменяемости» не нарушается. В этом случае возможно подставить значения констант и провести их свертку.

В примере рассмотрен тривиальный случай для этой оптимизации. При использовании функций, условных переходов и циклов анализ «изменяемости» переменных сильно усложняется. В реализации модуля в отличии от других компиляторов, не используется граф потока управления, но выполнение оптимизации возможно из-за структуры дерева, которая содержит для каждой области видимости свою таблицу символов.

Назад