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

153

Несмотря на то, что в новом графе(программе) столько же операторов, что и в предыдущем, операторы в области будут выполняться часто, так что ожидаемое время выполнения уменьшится.

Индуктивное перемещение

Определение. Пусть Y область определения с одним входом, а X переменная, появляющаяся в некотором операторе, входящем в один из участков Y. Пусть 1 2 .. ne1,e2,..,em – такой путь вычисления, что ei принадлежит Y, 1 £ i £ m. Обозначим через X1, X2,… значения, присе-

ваемые X в последовательности e1e2.. em. Если X1, X2.. образуют арифметическую прогрессию (с положительной или отрицательной разностью) для любого пути вычисления типа указанного выше, то будем X называть индуцированной переменной в Y.

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

Отметим, что задача нахождения всех индуцированных переменных в области нетривиальна (общего алгоритма не существует, но для частных случаев решения достаточно просты).

Пример. На рис.11.18 области { 2 и 3} имеют вход 2. Если вход в 2 осуществляется из 2¢ и управление повторно передается от 2 к

3 и снова к 2, то переменная I принимает значения 1,2,3,.. Таким образом, I – индуцированная переменная. Менее очевидно, что S – так же индуцированная переменная, поскольку она принимает значения Т+1, Т+2,. Т+3, а поскольку K не индуцированная, то она также принимает значения Т+1, 2Т+3, 3Т+6 ..

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

2, справедливы соотношения S=T+1 и I=S-T.

Если, как на рис. 11.18 какая-то индуцированная переменная используется только для управления в области(на это указывает тот факт, что ее значение не требуется за пределами области и что непосредственно перед входом в область ей присваивается всегда одна и та же константа), то ее можно исключить. Даже если за пределами области требуются все индуцированные переменные, внутри области можно использовать одну, а все остальные вычислить при выходе из области.

154

Пример. Рассмотрим рис. 11.18. Исключим индуцированную пере-

менную I. Ее роль будет играть S. Заметим, что после участка 2, переменная S принимает значениеT+I, так, что когда управление

возвращается от 3 к 2 должно выполняться соотношениеS=T+I-1. Таким образом, оператор S ¬ T+I, можно заменить наS ¬ S+1. Но

затем в 2¢ надо правильно инициировать S, так что, когда управление

перейдет из 2¢ в 2 значение S, после оператора будет Т+1.

Затем мы должны исправить проверкуI=1000?, так, чтобы получить эквивалентную проверку относительноS. При выполнении этой проверки S имеет значениеT+I. Следовательно, эквивалентной проверкой будет

R ¬ T+1000

S=R?

Поскольку R не зависит от области, вычисление R ¬Т+1000 можно

вынести в участок 2¢. Тогда можно полностью избавиться от I. Новый граф представлен на рис. 11.19.

K ¬ 0 B1

T ¬ J+1 S ¬ T

R ¬ T+1000

S ¬ S+1 K ¬ S+K S = R?

B2¢

B2

halt B4

Рис. 11.19. Дальнейшее преобразование графа управления.

На рис11.19 видно, что участок 3 исключен полностью, а область укорочена на один оператор. Конечно, размер участка 2¢ увеличился,

STORE I LOAD J ADD = 1 ADD I
ADD = 1
STORE S ADD =1000 STORE R

155

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

Шаг S ¬ T в 2¢ можно исключить, если отождествить S и T. Это возможно только по тому, что значения переменных S и T никогда не будут различными, но не смотря на это обе они будут«активными» в том смысле, что будут использоваться в дальнейших вычислениях.

Иными словами в 2 активна только переменнаяS, ни одна из них не

активна в 1, а в 2¢ обе активны между операторамиS ¬ T и R ¬ T+1000. Если Т заменить на S получим граф управления рис. 11.20.

K ¬ 0 B1

 

S ¬ J+1

B2¢

 

R ¬ T+1000

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

S ¬ S+1

K ¬ S+K B2

S = R?

halt B4

Рис. 11.20. Окончательный вариант графа управления.

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

дем новые

коды

операций(JZERO - переход в случае нулевого

сумматора и JNZ - переход в случае ненулевого сумматора)

LOAD = 0

LOAD = 0

STORE

K

STORE K

LOAD = 1

LOAD = J

цикл:

 

 

 

 

 

156

 

 

ADD

K

цикл: LOAD

S

 

STORE K

ADD

= 1

 

LOAD

I

STORE S

 

SUBTR =1000

ADD

K

 

JZERO выход

STORE K

 

LOAD

I

LOAD

S

 

ADD

= 1

SUBTR R

выход:

JMP цикл

JNZ цикл

END

 

END

 

 

а

 

б

 

Заметим, что длина программы такая же, однако цикл короче (8 команд вместо 12).

Замена сложных операций

Внутри областей возможна замена сложных операций. Если внутри области есть оператор видаA¬B*I, в котором значение В не зависит от области, а I индуктивная переменная, то можно заменить умножение сложением или вычитанием величины, равной произведению значений, не зависящих от области разности арифметических программ, порождаемой индуктивной переменной.

Пример.

 

DO 5 J = 1, N

 

DO 5 I = 1, M

5

A(I, J) = B(I, J)

Пусть A(I, J) запоминается в ячейке А+M*(J-1)+I для 1 £ I£ M, 1£ J £ N; аналогичное предположение сделаем относительноB(I, J). Для удобства обозначим ячейкуA+L через A(L). Тогда из исходной программы можно получить частично оптимизированную программу

N¢ ¬ N-1

J ¬ -1

J ¬ J+1 I ¬ 0

K ¬ M*J

цикл: I ¬ I+1

L ¬ K+I A(L) ¬B(L)

if I < M goto цикл

157

if J <N¢ goto цикл halt

Граф управления новой программы изображен на рис. 11.21. В этом

графе { 2, 3, 4}- кисть, в которой переменная М инвариантна, а J- индуктивная переменная, возврастающая на 1. Поэтому оператор K ¬ М*J можно заменить наК ¬ К+М, предварительно присвоив К значение –М вне области.

N ¬ N-1

J ¬ -1

J ¬ J+1

I ¬ 0

K ¬ J*M

I ¬ I+1

L ¬ K+I

A(L) ¬ B(L)

I < M?

J <N¢

halt

Рис. 11.21. Граф управления.

B1

B2

B3

B4

B5

Новый граф управления представлен на .рис11.22. Программа представляемая этим новым графом, длиннее прежней, но области,

соответствующие участкам 2², 3 и 4 будут исполняться быстрее, поскольку умножение заменено сложением.

158

N ¬ N-1

J ¬ -1

K ¬ -M

J ¬ J+1

I ¬ 0

K ¬ K+M

I ¬ I+1

L ¬ K+I

A(L) ¬ B(L)

I < M?

J <N¢

halt

Рис. 11.22. Новый граф управления.

B1

B2¢

B2²

B3

B4

B5

Можно получить более экономную программу, заменив всю об-

ласть { 2², 3, 4} одним участком. Окончательный граф управления представлен на рис. 11.23.

159

L ¬ 0

T ¬ M*N

L ¬ L+1

A(L) ¬ B(L)

L £ T

halt

Рис. 11.23. Окончательный граф управления. Развертывание циклов

Последние преобразование по улучшению кода, которое часто остается незамеченным, это развертывание циклов..

Рассмотрим граф на рис. 11.23.

 

 

 

I = 1

 

B1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

A(I) = B(I)

 

 

B2

 

 

I ³100?

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

halt

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

B3

 

 

 

I = I + 1

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Рис. 11.23. Граф управления.

В этом графе участки 1 и 2 выполняются 100 раз. Таким образом, 100 раз выполняется проверка. Не допуская никаких вольностей можно развернуть цикл на «один шаг» и получить граф рис. 11.24.