Скачиваний:
16
Добавлен:
01.05.2014
Размер:
14.81 Кб
Скачать

2.4. Триады и косвенные триады

Формат триады имеет вид:

<код операции>, <операнд1>, <операнд2> .

В качестве кодов операций триад можно использовать коды операций тетрад, за исключением операций условного перехода BE (BL, ВМ), которые для триад не используются.

В триадах отсутствует поле для записи результата. Если в качестве операнда некоторой триады нужно использовать результат выполнения другой (ранее выполненной) триады, то в соответствующее поле триады записывается ссылка на триаду, в которой этот результат был получен. Результаты выполнения триад хранятся отдельно.

Пример 1.

Запись в виде последовательности триад выражения А*В - С / D:

(1) *, А, В

(2) /, С, D

(3) -, (1), (2)

Номера триад указаны в скобках.

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

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

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

Пример 2.

Представить с помощью косвенных триад следующие операторы языка ПАСКАЛЬ:

А := В[j] + В[j + 1]; С := В[j] - B[j + 1]; D := B[j] + 2*В[j + 1];

Решение

Список триад Порядок выполнения триад

(1) SUBS, В, j (1), (2), (3), (4), (5),

(2) + , j, 1 (1), (2), (3), (6), (7),

(3) SUBS, В, (2) (1), (2), (3), (8), (9), (10)

(4) + , (1), (3)

(5) := (4), А

(6) -, (1), (3)

(7) :=, (6), С

(8) * , 2, (3)

(9) +, (1), (8)

(10) := , (9), D