Системное программное обеспечение: Основы трансляции. Карпушин А.Н - 55 стр.

UptoLike

57
Отметим, что в данном алгоритме последовательные номера триад (а сле-
довательно, и ссылки на них) устанавливаются не сразу. Это не имеет значения
при рекурсивной организации процедуры, но при другом способе обхода дерева
вывода в программе генерации кода лучше увязывать триады между собой
именно по ссылке (указателю), а не по порядковому номеру.
Для триад разработаны универсальные (машинно-независимые) алгоритмы
оптимизации кода. После их выполнения (оптимизации внутреннего представ-
ления) триады могут быть преобразованы в команды на языке ассемблера.
Оптимизация объектного кода методом свертки
Свертка объектного кодаэто выполнение во время компиляции тех опе-
раций исходной программы, для которых значения операндов уже известны.
Поэтому нет необходимости многократно выполнять их в самой результирую-
щей программедостаточно один раз выполнить их при ее компиляции.
Простейший вариант сверткивыполнение в компиляторе операций, опе-
рандами которых являются константы. Несколько более сложен процесс опре-
деления тех операций, значения которых могут быть известны в результате вы-
полнения других операций. Для этого служит специальный алгоритм свертки.
Алгоритм свертки работает со специальной таблицей T, которая содержит
пары <переменная>-<константа> для всех переменных, значения которых
уже известны. Кроме того, алгоритм свертки помечает те операции во внутрен-
нем представлении программы, для которых в результате свертки уже не требу-
ется генерация кода. Так как при выполнении алгоритма свертки учитывается
взаимосвязь операций, то удобной формой представления для него являются
триады, так как в других формах представления операций (таких как тетрады
или команды ассемблера) требуются дополнительные структуры, чтобы отра-
зить связь результатов одних операций с операндами других.
Алгоритм свертки триад последовательно просматривает триады линейно-
го списка и для каждой триады делает следующее:
1. Если операнд есть переменная, которая содержится в таблице T, то операнд
заменяется на соответствующее значение константы.
2. Если операнд есть ссылка на особую триаду типа C(K,0), то операнд заменя-
ется на значение константы K.
3. Если все операнды триады являются константами, то триада может быть
свернута. Тогда данная триада выполняется и вместо нее помещается особая
триада вида C(K,0), где Kконстанта, результат выполнения свернутой
триады. (При генерации кода для особой триады объектный код не порож-
дается, а потому она в дальнейшем может быть просто исключена).
4. Если триада является присваиванием типа A:=B, тогда:
если B – константа, то A со значением константы заносится в таблицу T
(если там уже было значение для A, то оно исключается).
если B – не константа, то A вообще исключается из таблицы T, если оно
там есть.