RSS    

   Реферат: Проектирование трансляторов

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

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

да имела место. Для этого только требуется, чтобы порядок, в  ко-

тором имена переменных впервые  появляются  в  последовательности

команд, совпадал с порядком мест, отведенных в векторах для соот-

ветствующих ячеек Fi и Li. В нашем примере переменная  V1  должна

быть определена до переменной V2 и т.д.

     При просмотре интервалов в порядке возрастания  значений  Fi

первая переменная помещается в ячейку T1. Для каждого  очередного

интервала (Fj,Lj) исследуются АКТИВНЫЕ интервалы, для которых па-

мять уже распределена, с тем чтобы выяснить, существует ли  такой

интервал (Fi,Li), что Li<Fj. Если такой интервал  существует,  то

переменная Vj помещается в ту же ячейку памяти, что и  переменная

Vi, а интервал (Fi,Li) отмечается как НЕАКТИВНЫЙ. Таким  образом,

на каждом этапе активные интервалы определяют текущие переменные,

которые размещены в ячейках памяти, а также  определяют  моменты,

когда эти ячейки освобождаются. Если не существует активного  ин-

тервала со значением Li<Fj, то нужно взять из стека новую  ячейку

и отвести ее для Vj.

     В нашем примере для V1 была бы отведена ячейка T1.  Так  как

L1>F2, то для V2 нужна новая ячейка, и поэтому для V2 была бы от-

ведена ячейка T2. С другой стороны, L2<F3, так что  можно  помес-

тить V3 в ту же ячейку памяти, что  и  V2  (т.е.  в  ячейку  T2).

Интервал для V2 теперь отмечается как неактивный. Так как  L1<F4,

то переменная V4 тоже помещается в ячейку T1.

                       3.3 Алгоритм Биледи

     Многие ЭВМ имеют небольшой набор быстрых регистров,  которые

сходны с ячейками основной памяти с той разницей, что выборка ин-

формации, запомненной в быстрых регистрах, требует во  много  раз

меньше времени, чем выборка из основной памяти.  На  самом  деле,

быстрые регистры могут  быть  индекс-регистрами  или  добавочными

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

образом в арифметических или логических операциях, но здесь мы не

учитываем эти свойства.

     Эти быстрые регистры могут быть  использованы  для  хранения

копий переменных, размещенных в основной памяти; что же  касается

временной переменной, то она может находиться в быстром  регистре

все время своего существования, не требуя места в основной  памя-

ти. Если число доступных быстрых регистров превышает  число  нуж-

ных переменных, то проблемы не возникает и быстрые  регистры  мо-

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

     Однако если число доступных быстрых  регистров  не  является

достаточным, то возникает ситуация, когда необходимо решать,  ка-

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

будет зависеть от частоты использования различных  переменных,  и

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

гистры.

     Алгоритм Биледи приводит к оптимальному результату при неко-

торых ограничениях и часто дает хорошие результаты в более  общих

случаях. Предполагается, что быстрые регистры должны  применяться

для хранения копий переменных из ОП и что использовать эти  пере-

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

     В дальнейшем будем предполагать, что  рассматриваемые  пере-

менные не будут изменяться;  поэтому,  если  нужно  заменить  ка-

кую-то переменную в быстром регистре, то нет необходимости  запо-

минать текущее содержимое быстрого регистра, так как копия  этого

содержимого уже есть в основной памяти.

     Возникающая задача похожа на задачу замещения страниц в сис-

теме с двумя уровнями памяти.

     Биледи (1966) сформулировал оптимальный алгоритм для случая,

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

лось в системе с двумя уровнями памяти для получения  оценки  эф-

фективности многих применяемых эвристических алгоритмов.

     Задача распределения быстрых регистров отличается от  задачи

с двумя уровнями памяти тем, что для нее нет необходимости выпол-

нять распределение до получения полной последовательности команд.

Поэтому алгоритм Биледи может быть применен  непосредственно  для

получения оптимальных результатов. Этот алгоритм прменялся в ком-

пиляторах в течение нескольких лет, и только с недавнего времени,

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

ним стало связываться имя Биледи.

     Интервалы, в которых используются  основные  переменные  Vi,

могут быть изображены диаграммой, как показано на рис. 20.8.

     V5                   ├────────────────┤

     V4             ├───────────────────┤

     V3       ├──────────────┼──────────────────┤

     V2    ├─────┼─────┼────────┤

     V1 ├───────────────────────────┤

        1  2  3  4  5  6  7  8  9  10  11  12  13

     Рис. 20.8 Диаграмма использования переменных Vi в последова-

тельности команд

     Каждая горизонтальная переменная изображает интервал для не-

которой переменной, причем точки указывают номера мест в последо-

вательности команд, где используется эта переменная. Будем  пред-

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

ная, так что на одной вертикали не может появится  двух  и  более

точек. Число горизонтальных линий,  пересекающихся  с  какой-либо

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

ствующий момент нужные значения переменных. Если число  пересече-

ний какой-то вертикали с различными горизонтальными линиями  пре-

вышает число доступных быстрых регистров, то одна или  более  чем

одна из переменных не может быть помещена в быстрых регистрах.

     Мы будем также полагать, что каждая выборка какой-либо пере-

менной из быстрого регистра требует  ничтожной  затраты  времени.

Если нужной переменной нет в быстром регистре, то необходимо  за-

менить содержимое одного из быстрых регистров  на  значение  этой

переменной. Определим функцию S(i,t) следующим образом:

     S(i,t)=0, если переменная Vi не находится в  быстром  регис-

тре в момент t;

     S(i,t)=1, если Vi находится в быстром регистре в момент t.

     Тогда сумма по всем номерам "t" не должна превышать N, где N

- число доступных быстрых регистров.

     Если m(t) - номер переменной, используемой в команде "t", то

функцию U, характеризующую  эффективность  использования  быстрых

регистров, можно определить следующим образом:

     U=сумма S(m(t),t)).

         t

     Максимальное значение функции U (при заданных выше ограниче-

ниях) достигается, когда наибольшее число использований  перемен-

ных будет происходить путем непосредственного  обращения  к  быс-

трым регистрам. Единственное доп. ограничение состоит в том, что

     S(m(t-1),t)=1

     для всех значений t. Это означает, что каждая переменная при

использовании заносится в быстрый регистр.

     Алгоритм Биледи состоит в следующем.

     Последовательность команд исследуется, начиная с первой  ко-

манды, определенной значением t=1. Для каждого  значения  t  рас-

сматривается переменная Vi, где i=m(t), и выполняются действия по

одному из следующих вариантов:

     (1) Для переменной Vi отведен  быстрый  регистр;  тогда  ис-

пользуется этот регистр.

     (2) Для переменной Vi  не  отведено  быстрого  регистра,  но

имеется неиспользованный быстрый регистр; в  таком  случае,  этот

регистр отводится для Vi.

     (3) Для переменной Vi не отведено быстрого регистра, и  рас-

пределены все быстрые регистры. Тогда рассматриваются переменные,

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

если значение какой-то одной из них  больше  не  потребуется,  то

соответствующий быстрый регистр теперь отводится для Vi. Если со-

держимое всех быстрых регистров все еще необходимо, то для Vi от-

водится быстрый регистр, соответствующий той переменной,  следую-

щее использование которой наиболее удалено от данной команды.

     Пусть имеются 3 быстрых регистра R1, R2 и R3. Начиная с  мо-

мента t=1 первые три команды отведут регистры R1, R2 и R3 для пе-

ременных V1, V2 и V3. В момент t=5 содержимое всех  трех  быстрых

регистров еще необходимо, а требуется регистр для V4.  Переменная

V1 не будет использоваться до момента  t=10,  тогда  как  V2  ис-

пользуется при t=6 и V3 - при t=8. Поэтому регистр R1 теперь  ис-

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40


Новости


Быстрый поиск

Группа вКонтакте: новости

Пока нет

Новости в Twitter и Facebook

                   

Новости

© 2010.