Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования методов трансляции.-1.pdf
Скачиваний:
13
Добавлен:
05.02.2023
Размер:
1.36 Mб
Скачать

111

Если дан блок , то можно найти эквивалентный ему приведенный блок повторно применяю Т1 и Т2. Поскольку каждое применение Т1 и Т2 сокращает длину блока, в конце концов мы должны прийти к при-

веденному блоку. Для приведенных блоков 1 º 2, тогда и только

тогда, когда D( 1) = D( 2). Таким образом если дан блок , то можно найти единственный граф, соответствующий всем приведенным бло-

кам, получаемым из , независимо от конкретной последовательности преобразований Т1 и Т2, в результате которой был получен приведенный блок.

Определение. Пусть Р=S1Sn – список операторов блока. Обозначим через E(Р) множество выражений вычисляемых вР. Формально Е(Р) = {vt(A) | St – осуществляет присвоение переменной А, 1≤ t n}.

Выражение h вычисляется в Р к раз, если существует к таких различных значений t, что vt(A) = n и St присваивает значение А.

Лемма. Если = (P, I, V) – приведенный блок, то Р не вычисляет никакого выражения более одного раза.

Лемма. Если 1 = (P1, I1, U1) и 2 = (Р2, I2 ,U2)- эквивалентные приведенные блоки, то Е(Р1) = Е(Р2).

Теорема. Если 1 и 2 – два приведенных блока, то 1 º 2, тогда

и только тогда, когда D( 1) = D( 2).

Следствие. Все приведенные блоки эквивалентные данному имеют один и тот же граф.

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

Теорема. 1= 2, тогда и только тогда, когда 1 Û1,2,3,4 2.

6.1.5.Оптимизация блоков

Основная задача оптимизации преобразовать блок , в блок ¢, оп-

тимальный относительно некоторой оценки блока (рис. 11.3).

P0

 

Оптими-

¢

Генера-

 

 

затор

 

тор

 

 

 

 

Кода

 

 

 

 

 

 

 

Рис. 11.3. Схема оптимизации.

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

112

полнения. Оптимизатор применяет к блоку последовательность пре-

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

Определение. Оценка блоков - это функция отображающая блоки в

вещественные числа. Блок называется оптимальным относительно

оценки С, если С( ) ≤ C( ¢), для всех ¢ эквивалентных . Оценка

называется приемлемой, если 1Þ1, 2 2 влечет С( 2) ≤ С( 1) и любой блок имеет эквивалентный блок, оптимальный относительно С. Иными словами, оценка приемлема, если преобразования Т1 и Т2 применяемые в прямом направление, не увеличивают оценки блока.

Лемма. Если С - приемлемая оценка, то любой блок имеет эквивалентный приведенный блок, оптимальный относительно С.

Теорема. Пусть - любой блок. Существует блок ¢ эквивалент-

ный и такой, что, если С - приемлемая оценка, то найдутся такие блоки, что

1)¢ Û4 1,

2)1 Û3 2,

3)2 оптимальный относительно С.

Таким образом, если мы хотим оптимизировать данный блок :

1) сначала можно исключить из лишние и бесполезные вычисления и переименовать переменные с тем, чтобы получить приведен-

ный открытый блок ¢,

2)затем в ¢ можно переупорядочить операторы с помощью пе-

рестановки и делать это до тех пор, пока не сформируется блок 1, в котором операторы расположены в наилучшем порядке,

3)наконец, в 1 можно переименовать переменные до тех пор,

пока не будет найден оптимальный блок 2.

Пример. Рассмотрим машинный код, генерируемый для блоков. Вычислительная машина имеет один сумматор и следующий набор команд ассемблера:

1)LOAD M – содержимое ячейки памяти М помещается на сум-

матор.

2)STORE M – содержимое сумматора, запомнить в ячейке памя-

ти М.

113

3) q M2M3Mr. В этой команде q - имя r-местной операции. Ее первый аргумент - сумматор, второйячейка памяти М2 и т.д. Результат применения операции q к своим аргументам размещается на сумматоре.

Генератор кода должен переводить оператор видаА¬qB1B2Br в последовательность машинных команд

LOAD B1

q B2, B3Br

STORE A.

Однако если значениеB1 уже находится на сумматоре(т.е. перед этим было присвоение значенияВ1), то первую команду LOAD генерировать не надо. Аналогично, если значение А не требуется негде, кроме первого аргумента следующего оператора, то команда STORE не нужна.

Оценить оператор А¬qB1Br можно числами 1,2,3. Оценка равна 3, если B1 нет на сумматоре и в дальнейшим есть ссылка на новое значение А, отличная от первого аргумента следующего оператора(т.е. А надо запомнить). Оценка равна 1, если В1 уже на сумматоре и нет ссылок на А, отличной от первого аргумента следующего оператора. В остальных случаях оценка равна 2.

Рассмотрим блок 1=(P, {A, B, C}, {F, G})

F=(A+B)*(A-B) G=(A-B)*(A-C)*(B-C)

Список операторов Р1 таков:

T¬A+B

S¬A-B

F¬T*S

T¬A-B

S¬A-C

R¬B-C

T¬T*S

G¬T*R.

Бесполезных операторов нет, но есть повторения - второй и четвертый операторы. Эту избыточность можно удалить. В результате полу-

чим приведенный операторный блок 2=(P2, {A, B, C}, {X3 ,X7})

X1¬A+B

X2¬A-B

X3¬X1-X2

X4¬A-C

114

X5¬B-C

X6¬X2*X4

X7¬X6*X5

Рис. 11.4. Граф для 2.

Граф для 2 изображен на рис. 11.4. Существует много программ, в

которые можно преобразовать 2 с помощью Т4.

Следующий алгоритм дает линейное упорядочивание вершин графов. В требуемом блоке операторы, соответствующие этим вершинам расположены в обратном порядке.

1)Строим список L. В начале он пуст.

2)Выбираем вершину n графа так, что nÏL и, если существует входящие в n дуги, они должны выходить из вершин уже принадлежащих к L. Если такой вершины нет, то остановится.

3)Если n1- последняя вершина, добавляемая к L, самая левая дуга, выходящая из n1, указывает на внутреннюю вершину n, не принадлежащую L, и все прямые предки n уже принадлежат L, то добавляем n

кL и повторяем шаг 3), в противном случае переходим на шаг 2).

На приведенном графе можно начать с L = n3. Согласно шагу 3), к L добавляем n1. Затем выбираем и добавляем к L вершину n7, а потом n4

и n5, так что L имеет вид n3, n1, n7, n6, n2, n4, n5. Оператор, присваивающий значение Xi, порождает вершину ni, и что список L соответствует

операторам в обратном порядке, получаем блок 3=(P3, {A, B, C}, {X3, X7}), где Р3

X5¬B-C

X4¬A-C

X2¬A-B