скачать рефераты
  RSS    

Меню

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

скачать рефераты

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

                     │                    │        └────┼──┘

                     │                    │             │

                     │                    │             │ j

                     │                    │             │

                     │                    │             │

                     │                    │             └──────┐

       E             │       F            │     G              │

            ┌─────┐  │           ┌─────┐  │           ┌─────┐  │

  ┌─────────┼─    │  │ ┌─────────┼─    │  │ ┌─────────┼─    │  │-2

  │         ├─────┤  │ │         ├─────┤  │ │         ├─────┤  │

  │   ┌─────┼─    │  │ │   ┌─────┼─    │  │ │   ┌─────┼─    │  │-1

  │   │     ├─────┤  │ │   │     ├─────┤  │ │   │     ├─────┤  │

  │   │   ┌─┼─    │<─┘ │   │   ┌─┼─    │<─┘ │   │   ┌─┼─    │<─┘ 0

  │   │   │ ├─────┤    │   │   │ ├─────┤    │   │   │ ├─────┤

  │   │   │ │   │ │    │   │   │ │   │ │    │   │   │ │   │ │    1

  │   │   │ └───┼─┘    │   │   │ └───┼─┘    │   │   │ └───┼─┘

  │   │   │     │      │   │   │     │      │   │   │     │

H┌─┬─┬─┬─┬─┬─┬───┬────┬─┬─┬─┬─┬─┬─┬───┬────┬─┬─┬─┬─┬─┬─┬────┬───┐

 │ │ │ │ │ │ │   │    │ │ │ │ │ │ │   │    │ │ │ │ │ │ │    │   │

k└─┴─┴─┴─┴─┴─┴───┴────┴─┴─┴─┴─┴─┴─┴───┴────┴─┴─┴─┴─┴─┴─┴────┴───┘

  0 1 0 1 0 1  0    1  0 1 0 1 0 1  0    1  0 1 0 1 0 1   0   1

     Рис. 20.6 Схема обращения к элементам массива с помощью век-

торов Айлифа

     Пусть запись вида (B+5) означает содержимое по  адресу  B+5.

Тогда к элементу B[i,j,k] можно обратиться следующим образом:

     (((C)+i)+j)+k

     При этом выбирается содержимое ячейки C и к нему прибавляет-

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

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

щий более низкий уровень, и т.д.

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

массива не требуется выполнения операций умножения. Вместе с  тем

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

буется еще один вектор длины 3 и три вектора длины 4, и таким об-

разом, вместо 24 элементов требуется 39. Этот  метод  оказывается

наиболее экономичным, когда диапазоны изменения индексов увеличи-

ваются от первого к последнему. Наименее всего этот метод  эффек-

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

     В приведенном примере не производилось проверки  корректнос-

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

каждым элементом вектора Айлифа граничной пары для  соответствую-

щего индекса. Правда, в случае прямоугольного массива  это  могло

бы оказаться неэкономичным. У каждого из элементов векторов E,F и

G в рассматриваемом примере были бы  одинаковые  граничные  пары.

Однако следует обратить внимание на то, что с каждым из этих эле-

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

ло бы возможность, используя векторы Айлифа, обращаться к  масси-

вам со значительно более сложной структурой.

     Так, например, на рис. 20.7 показан набор  векторов  Айлифа,

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

хранятся в следующем порядке:

     B[4,-1,-1]      B[5,1,2]      B[6,0,0]

     B[4,-1, 0]      B[5,2,2]      B[6,0,1]

     B[4,-1, 1]      B[5,2,3]      B[6,0,2]

     B[4,-1, 2]      B[5,3,2]      B[6,0,3]

     B[4, 0, 0]      B[5,3,3]      B[6,0,4]

     B[4, 0, 1]      B[5,3,4]      B[6,0,5]

     B[4, 0, 2]      B[5,3,5]

     B[4, 0, 3]

     B[4, 0, 4]

     B[4, 0, 5]

     B[4, 0, 6]

                ┌─────┬─┬─┐

                │     │4│6│

                └──┼──┴─┴─┘                        ─ ─ ─ ─ ─

                   └────────────────────────────> │          │

                                                   ─ ─ ─ ─ ─

                                                  │          │

                                                   ─ ─ ─ ─ ─

                                                  │          │

                                                   ─ ─ ─ ─ ─

                                                  │          │

                                                  ┌────┬──┬──┐

                   ┌──────────────────────────────┼──  │-1│ 0│

                   │                              ├────┼──┼──┤

                   │                     ┌────────┼──  │ 1│ 3│

                   │                     │        ├────┼──┼──┤

                   │                     │        │    │ 0│ 0│

                   │                     │        └─┼──┴──┴──┘

                   │                     │          │

                   │                     │          │

                   │      ─ ─ ─ ─ ─ ─    │    ┌─────┘

                   │     │           │<──┘    │

                   │     ┌─────┬──┬──┐        │

                   │ ┌───┼─    │ 2│ 2│        │

     ┌─────┬──┬──┐ │ │   ├─────┼──┼──┤     ┌─────┬───┬──┐

   ┌─┼─    │-1│ 2│ │ │┌──┼─    │ 2│ 3│    ┌┼─    │  0│ 5│

   │ ├─────┼──┼──┤ │ ││  ├─────┼──┼──┤    │└─────┴───┴──┘

   │ │     │ 0│ 6│<┘ ││  │     │ 2│ 5│    │

   │ └───┼─┴──┴──┘   ││  └─┼───┴──┴──┘    │

   │     │         ┌─┘│    │              │

   │     │         │ ┌┘  ┌─┘         ┌────┘

   │     │         │ │   │           │

   │     │         │ │   │           │

┌─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┬─┐

│ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │

└─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┴─┘

     Рис. 20.7 Пример векторов  Айлифа  для  трехмерного  массива

сложной структуры

         2.3 Замечания по поводу "разреженных" массивов

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

ров Айлифа или подобной ей схеме  с  использованием  дескрипторов

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

ний элементов. В этих случаях можно рассматривать пару  "информа-

ционный элемент" - "значения индексов" как элемент информационно-

го множества, а задание значения (нетривиального) элементу масси-

ва - как пополнение множества,  а  задание  неопределенного  (или

тривиального) значения - как удаление элемента из множества.

     Представление таких "неполных" (или "разреженных")  массивов

реализуется как представление множеств.

            3. ОРГАНИЗАЦИЯ ПАМЯТИ ВО ВРЕМЯ ТРАНСЛЯЦИИ

                3.1 Проблемы распределения памяти

     Распределение памяти для определенных программистом перемен-

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

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

соответствующей программной единицы. Однако для современных ЭВМ и

ОС, требующих разделения неизменяемой и изменяемой  частей  прог-

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

отдельные области памяти.

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

память для временных переменных, т.е. промежуточных  результатов,

потребность в которых появляется при компиляции.  Эти  переменные

определяются не в программе на входном языке, а компилятором. Ре-

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

лить, полностью зависит от компилятора.  Поэтому  нужен  алгоритм

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

Здесь под эффективностью обычно понимается стремление минимизиро-

вать объем используемой памяти.

     Распределение памяти становится нетривиальной задачей в  том

случае, когда у ЭВМ существует более чем один уровень памяти.

     У многих машин имеются ограниченные  наборы  быстрых  регис-

тров, которые отличаются от основной памяти  либо  более  быстрым

доступом, либо иными, более удобными свойствами. Эффективное  ис-

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

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

        3.2 Распределение памяти для временных переменных

     Алгоритмы генерации команд не касаются распределения  памяти

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

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

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

менная переменная. Алгоритм распределения памяти  должен  размес-

тить эти переменные  в  памяти  так,  чтобы  потребовалось  мини-

мальное число ячеек памяти.

     ИНТЕРВАЛОМ для переменной называется отрезок  времени  между

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

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

заны, могут быть совмещены в памяти.

     Рассмотрим набор переменных V1, V2, V3, ..., Vn. Для  каждой

переменной Vi определена команда ST Vi, которая присваивает  этой

переменной начальное значение и означает начало интервала для Vi.

     Определяется также команда U Vi, которая означает  очередное

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

пользующая Vi, означает конец интервала для Vi. Команда  U  будет

применяться для обозначения таких команд, как ADD, SUB и т.д.

     Для вычисления значения выражения  (a+b*c)/(f*g-(d+e)/(h+k))

генератор команд по дереву разбора сформировал следующую последо-

вательность машинных команд:

     L    h

     ADD  k

     ST   V1

     L    d

     ADD  e

     DIV  V1

     ST   V2

     L    f

     MPY  g

     SUB  V2

     ST   V3

     L    b

     MPY  c

     ADD  a

     DIV  V3

     Имена V1, V2 и V3 были взяты из  множества  неиспользованных

имен. Алгоритм распределения памяти, который мы хотим определить,

должен показать, что фактически эти три переменные могут быть по-

мещены в одну и ту же ячейку памяти T1.

Страницы: 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23


Новости

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

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

Пока нет

Новости в Twitter и Facebook

  скачать рефераты              скачать рефераты

Новости

скачать рефераты

© 2010.