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

 

 

115

 

X6¬X2*X4

 

 

 

X7¬X6*X5

 

 

 

X1¬A+B

 

 

 

X3¬X1*X2.

 

 

 

LOAD

A

LOAD

B

ADD

B

SUBTR C

STORE X

STORE X5

LOAD

A

LOAD

A

SUBTR B

SUBTR C

STORE X2

STORE X4

LOAD

X1

LOAD

A

MULT

X2

SUBTR

B

STORE X3

STORE X2

LOAD

A

MULT

X4

SUBTR C

MULT

X5

STORE X4

STORE X7

LOAD

B

LOAD

A

SUBTR C

ADD

B

STORE X5

MULT

X2

LOAD

X2

STORE

X3

MULT

X4

 

 

MULT

X5

 

 

STORE X7

 

 

а – из 2

б – из 3

 

6.1.6.Алгебраические преобразования

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

возможно сделать с использованием четырех рассмотренных выше типов преобразований.

Рассмотрим наиболее распространенные алгебраические преобразования.

1)Бинарная операция q называется коммутативной, если aqb = bqa для всех выраженийa и b. Примером коммутативных операций случат сложение и умножение чисел.

2)Бинарная операция q называется ассоциативной, если aq(bqg)

=(aqb)qg для всех a, b и g. Например сложение коммутативно, так как a+(b+g) = (a+b)+g.

116

3) Бинарная операция q1 называется дистрибутивной относительно бинарной операции q2, если aq1(bq2g) = (aq1b)q2(aq1g). Например, умножение дистрибутивно относительно сложения, так как a*(b+g) = a*b+a*g.

4)Унарная операция q называется идемпотентной, если qqa = a для всех a. Например, логическое не и унарная операция«минус» идемпотентны.

5)Выражение e называется нейтральным относительно бинарной операции q, если eqa = aqe = a для всех a.

(а) Константа 0 нейтральна относительно сложения. Нейтрально и

любое выражение, имеющее значение 0, Например, a - a, a * 0, (-a) + a.

(б) Константа 1 нейтральна относительно умножения.

(в) Логическая константа истина нейтральна относительно конъюнкции (т.е. a Ù истина = a для всех a).

(г) Логическая константа ложь нейтральна относительно дизъюнкции (т.е. a Ú ложь = a для всех a).

Если A – множество алгебраических законов, будем говорить, что

выражение a эквивалентно выражению b относительно A (и писать a ºA b), если a можно преобразовать вb, применяя только алгебраические законы A.

Пример. Рассмотрим выражение

A * (B * C) + (B * A) * D +A * E.

С помощью ассоциативного закона умножения можно записать A*(B*C) в виде (A*B)* C. С помощью коммутативного закона умноже-

ния можно записать B*A в виде A*B. Применяя дистрибутивный закон, все выражение можно записать

(A * B)* (C + D) +A * E.

Наконец, применяя ассоциативный закон к первому слагаемому, затем дистрибутивный закон, можно записать выражение как

(A * (B * (C + D) + E).

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

Определение эквивалентности относительно множества алгебраических законов A можно распространить и на блоки. Будем говорить,

117

что блоки 1 и 2 эквивалентны относительно A (и писать 1 ºA 2),

если существует такое выражение b Î v( 2), что a ºA b, и обратно. Пример. Если сложение коммутативно, то преобразование блоков,

соответствующее этому алгебраическому закону, позволяет заменять в блоке оператор вида X ¬ A+B на оператор X ¬ B+A. Соответствующие преобразования графа позволяют заменить всюду в графе структуру

+

+

на

b

a

a

b

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

Обычный подход к решению этого вопроса заключается в том, что алгебраические преобразования применяют в ограниченном виде, надеясь сделать больше «упрощений» выражений и выработать, возможно, большее число общих подвыражений. В типичной схемеbqa заменяется на aqb, если q - коммутативная бинарная операция, а a предшествует b при некотором лексикографическом упорядочении имен переменных. Если q - ассоциативная и коммутативная бинарная операция, то a1qa2qqan можно преобразовав, располагая имена a1,…, an в лексикографическом порядке и группирую их слева направо.

Пример. Рассмотрим блок = (P, I, {Y}), где I = {A, B, C, D, E, F}, а P – последовательность операторов

X1 ¬ B-C

X2 ¬ A*X1

118

X3 ¬ E*F

X4 ¬ D*X3

Y ¬ X2*X3

Блок вычисляет выражение

Y = (A * (B – C)) * (D * (E * F)).

Граф для приведен на рис. 11.5.

 

 

*

 

*

 

 

*

A

-

D

+

B C E F

Рис. 11.5. Граф для .

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

няя к коммутативные и ассоциативные преобразования для умножения проведем последовательное преобразование программы.

Полагая, что умножения ассоциативно, можно заменить два опера-

тора в

X3 ¬ E*F

X4 ¬ D*X3

на три оператор

X3 ¬ E*F

X3¢ ¬ D*E

X4 ¬ X3¢*F

Теперь оператор X3 ¬ E*F бесполезен, и его можно удалить преобразованием T1. Затем с помощью ассоциативного преобразования можно заменить операторы

X4 ¬ X3¢*F

119

Y ¬ X2*X3

на

X4 ¬ X3¢*F

X4¢ ¬ X2* X3¢ Y ¬ X4¢* F

Оператор X4 ¬ X3¢*F теперь бесполезен, и его можно удалить. Таким образом имеем пять операторов

X1 ¬ B-C

X2 ¬ A*X1

X3¢ ¬ D*E X4¢ ¬ X2* X3¢ Y ¬ X4¢* F

Если применить ассоциативные преобразования еще раз к третьему и четвертому оператору, получим

X1 ¬ B-C

X2 ¬ A*X1

X3² ¬ X2*D

X4¢ ¬ X3²*E

Y ¬ X4¢* F

Наконец, если предположить, что умножение коммутативно, мож-

но переставить операнды второго оператора и получить блок ¢:

X1 ¬ B-C

X2 ¬ X1* A

X3² ¬ X2*D

X4¢ ¬ X3²*E

Y ¬ X4¢* F

Граф для ¢ изображен на рис. 11.6. Блок ¢ имеет оценку 7, самую нижнюю возможную оценку для исходной программы.