Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции.doc
Скачиваний:
17
Добавлен:
20.06.2014
Размер:
523 Кб
Скачать
☆

Генерация кода

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

A : = B * C + D – B * 10

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

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

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

Многоадресный код с явно именуемым результатом

Каждая операция представляется в виде четырех составляющих:

операция (операнд 1; операнд 2; результат)

1 2 3 4

1 – код операции;

2, 3 – операнды;

4 – результат.

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

Последовательность тетрад:

  1. *(B, C, T1)

  2. +(T1, D, T2)

  3. *(B, 10, T3)

  4. –(T2, T3, T4)

  5. :=(T4, 0, A)

Здесь Т1 – Т4 временные переменные

0 – пропуск операнда

Последовательность тетрад может подвергаться порядка операций для оптимизации машинного кода.

Достоинства:

  1. Простота построения.

Недостатки:

  1. На современных архитектурах практически нет трехадресных команд;

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

Современные машинные команды, как правило, помещают результат на место одного из операндов.

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

операция (операнд 1, операнд 2)

1 2 3

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

    1. *(B, C)

    2. +(^1, D)

    3. *(B, 10)

  1. –(^2, ^3)

  2. :=(A, ^4)

^N – ссылка на результат триады с соответствующим номером.

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

mov eax, c

mov ecx, d

add eax, -10

imul eax, b

add eax, ecx

mov a, ecx

b * c + d – b * 10 ≡ (c – 10) * b + d

Еще одним с последовательностью записи операций при генерации кода является так называемая польская запись. В отличие от ранее рассмотренных префиксных форм, где операции предшествуют операндам, в постфиксной польской форме операции записываются после операндов. Такая форма ориентирована на стековые архитектуры, где активно используется вершина стека и как аргумент, и как место сохранения результата. Отсюда следует недостаток, т.к. операции со стеком практически не поддаются переупорядочиванию.

Соседние файлы в предмете Системное программное обеспечение