Модели оптимизации глазка

Я читал о методах компиляции локальной оптимизации, но я не понимаю, как они реализованы. Идея состоит в том, что оптимизатор каждый раз просматривает "окно" кода и каким-то образом обнаруживает шаблоны и заменяет их более оптимизированными версиями.

Мой вопрос: как можно обнаружить эти паттерны? (допустим, ваша платформа - это виртуальная машина, которая выводит ассемблерный код для готового компьютера, такого как Hack Шоккена).

Люди на самом деле проверяют код вручную (используя графики потоков управления, группы обеспечения доступности баз данных или что-то еще), а затем собирают все идентифицированные шаблоны и кодируют их в оптимизаторе? Или есть автоматический способ.

Например, вы подаете код, подлежащий оптимизации, в анализаторе, и он извергает указанные шаблоны. Если так, как можно начать писать?

2 ответа

Классическая оптимизация глазка касается не снижения прочности, а того, что вы называете. Это 2-3 последовательности команд, как например

BRANCH FALSE $1
BRANCH $2
$1:

который может быть уменьшен до

BRANCH TRUE $2

Подобные последовательности могут возникать в наивных генераторах кода, таких как однопроходные компиляторы, которые не генерируют AST, такие как некоторые компиляторы COBOL, над которыми я работал.

От вас зависит, будете ли вы писать свой собственный анализатор или использовать уже существующие. В любом случае ваш анализатор продолжает проверять код, пока он не станет более оптимизированным. Если вы берете пример GCC, у него есть определенные проходы для оптимизации. Промежуточный код вашей программы присваивается этим проходам, которые выполняются один за другим и оптимизируют ваш код. Также любой проход может выполняться более одного раза.
Если вы действительно хотите узнать, как написать эти оптимизации, просто просмотрите файл pass.h в GCC.