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

142

6.3.2.Анализ потока управления

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

Определение. Оператор S в программе P называется входом в линейный участок, если он

1)первый оператор в P или

2)помечен идентификатором, появляющимся после goto в операторе перехода либо в условном операторе, или

3)непосредственно следует за условным оператором.

Линейный участок, относящийся к входу в участок S, состоит из S

ивсех операторов , следующих за S,

1)вплоть до оператора останова и включая его, или

2)вплоть до входа в следующий линейный участок, но не вклю-

чая его.

Пример.

read p

Участок 1

 

read q

Участок 2

цикл:r ¬ remainder(p, q)

 

if r = 0 goto выход

Участок 3

p ¬ q

 

q ¬ r

 

goto цикл

участок 4

выход: write q

 

halt

Из участков программы сконструировать граф, весьма похожий на блок-схему программы.

Определение. Графом управления назовем помеченный ориентированный граф G, содержащий выделенную вершину n, из которой достижима каждая вершина G. Вершину n назовем начальной.

Граф управления программы – это граф управления, в котором каждая вершина соответствует какому-нибудь участку программы. Предположим, что вершины i и j графа управления соответствуют участкам i и j программы. Тогда дуга идет из вершины i в вершину j, если

143

1)последний оператор участкаi не является ни оператором перехода, ни оператором перехода, ни оператором останова, а участок j следует за участком i, или

2)последний оператор участка i является оператором goto L, где L -метка первого оператора участка j.

Участок, содержащий первый оператор программы, назовем

начальной вершиной.

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

Пример. Граф управления программой изображен на рис. 11.14.

read p

Участок 1

read q

цикл: r ¬ remainder(p, q)

Участок 2

if r=0 goto выход

 

 

 

 

p ¬ q

 

выход:write q

Участок 4

Участок 3

q ¬ r

 

halt

 

 

 

goto цикл

 

 

 

 

 

 

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

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

Эти связи между определением и ссылкой зависят от последовательности выполняемых участков. Первым участком в последовательности будет начальная вершина, а в каждый должна вести дуга из предыдущего. Иногда предикаты, используемые в условных операторах, могут запрещать переходы по некоторым путям в графе управления. Однако, алгоритма для выявления всех таких операций нет, и мы будем предполагать, что нет «запрещенных путей».

Удобно так же знать, существует ли для участка , такой участок

¢, что всякий раз когда выполняется , перед ним выполняется ¢. В

частности, если мы знаем это и если в обоих участках и ¢ вычисля-

144

ется одно и то же значение, можно заполнить его после вычисления

¢и избежать тем самым перевычисления его в . Формализуем эти предположения.

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

Последовательность участков 1, 2, . n из D назовем путем вычисления (участков) в F, если

1)1- начальная вершина в F,

2)для 1< i £ n существует дуга , ведущая из i-1 в i.

Другими словами, путь вычисления 1, 2, . n – это путь в F из

1 в n в котором 1 - начальная вершина.

Будем говорить, что участок ¢ доминирует над участком , если

¢ ¹ и каждый путь, ведущий из начальной вершины в , содержит

¢.

Будем говорить, что ¢ прямо доминирует над , если

1)¢ доминирует над и

2)если ² доминирует над и ² ¹ ¢, то ² доминирует над

¢.

Таким образом, участок ¢, прямо доминирует над , если – «бли-

жайший» к ¢ участок, доминирующий над .

Пример. На рис. ??? – это путь вычисления. Участок 1 прямо доминирует над участком 2 и доминирует над участками 3 и 4. Участок 2 прямо доминирует над участком 3 и 4.

Лемма.

1)Если 1 доминирует над 2, а 2 над 3, то 1 доминирует над 3 (транзитивность).

2)Если 1 доминирует над 2, то 2 не доминирует над 1 (асимметричность).

3)Если 1 и 2 доминируют над 3, то либо 1 доминирует над

2, либо 2 над 1.

Лемма. Каждый участок, кроме начальной вершины, имеет единственный прямой доминатор.

Алгоритм вычисления прямого доминирования

Вход. Граф управления F и множество D = { 1, 2, . }.

145

Выход. Прямой доминатор DOM( ) участка для которого 'D, кроме начальной вершины.

Метод. DOM( ) вычисляется рекурсивно для каждого из D–{ 1}.

В любой момент DOM( ) будет участком ближайшим к . Среди всех участков, для которых уже известно, что они доминируют над . В

конечном итоге DOM( ), будет прямым доминатором участка . Вна-

чале DOM( ) – это 1 для всех из D–{ 1}. Для i =1,2,3..n выполняются следующие два шага:

1) Исключаем участок i из F. Находим все участки , ставшие теперь недостижимыми из начальной вершиныF. Участок i домини-

рует над тогда и только тогда , когда становится недостижимым

из начальной вершины после исключения i из F. Снова заносим i в

F.

2) Предположим, что на шаге 1) обнаружено, что i доминирует над . Если DOM( )=DOM( i ), берем i в качестве DOM( ). В про-

тивном случае DOM( ) не меняем.

Пример. Применим данный алгоритм к графу управления алгорит-

ма Евклида. Здесь D={ 1, 2,

3, 4}. Последовательные значения

DOM( ) после исследований

участков i 2£ i £ 4 приведены в табл.

11.5.

 

 

 

 

Таблица 11.5.

 

 

 

 

I

DOM( 2)

 

DOM( 3)

DOM( 4)

Вначале

1

 

1

1

2

1

 

2

2

3

 

4

1

 

2

2

 

1

 

2

2

Вычислим строку 2. После исключения 2 участки 3 и 4 стано-

вятся недостижимые. Таким образом, 2 доминирует над 3 и 4. Пе-

ред этим DOM( 2) = DOM( 3) = 1, тогда в соответствии с шагом 2

выберем 2 в качестве DOM( 3). Аналогично, полагаем 2 =

DOM( 4). Исключение 3 и 4 не делает никакой участок недостижимым.