Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

8.8 Косвенные триады

Еще одно представление трехадресного кода состоит в использовании списка указателей на триады вместо списка самих триад. Такая реализация называется косвенными тройками или косвенными триадами. В качестве примера воспользуемся массивом statement для перечисления указателей на тройки в требуемом порядке. Тройки на рис. 44 могут быть представлены, как на рис 46.

Statement

op

arg1

arg2

(0)

(14)

uminus

с

(1)

(15)

*

b

(14)

(2)

(16)

uminus

c

(3)

(17)

*

b

(16)

(4)

(18)

+

(15)

(17)

(5)

(19)

assign

a

(18)

Рис. 46. Косвенные триады, представляющие трехадресные инструкции

8.9 Сравнение представлений: использование косвенного обращения

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

Более важное преимущество тетрад проявляется в оптимизирующем компиляторе, где инструкции зачастую, перемещаются. При использовании тетрад таблица символов добавляет дополнительную степень косвенности между вычислением значения и его использованием. При перемещении инструкций, вычисляющих x, инструкция, использующая это значение, не требует внесения никаких изменений. В случае же использования триад перемещения инструкции, определяющие временное значение, требует изменения всех ссылок на эту инструкцию в массивах arg1 и arg2. Эта проблема затрудняет использование триад в оптимизирующих компиляторах.

При использование косвенных триад такой проблемы не возникает – перемещение инструкций осуществляется простым переупорядочением списка statement. Поскольку указатели на временные значения ссылаются на массив значений op-arg1-arg2, который остается неизменным, ни один из этих указателей не нуждается в изменениях при перемещении триад. Таким образом, косвенные триады очень похожи на тетрады с точки зрения их использования. Обе системы записи требуют примерно одинакового количества памяти, они одинаково эффективны при переупорядочении кода. Как и в случае с обычными триадами, выделение памяти для временных пере­менных должно быть отложено до фазы генерации целевого кода. Однако косвенные триады могут сэкономить определенный объем памяти по сравнению с тетрадами, ес­ли некоторое временное значение используется несколько раз. Причина этого в том, что две или более записей таблицы statement могут, указывать на одну и ту же строку в структуре op-arg1-arg2.