Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
7 Генерация кода.doc
Скачиваний:
3
Добавлен:
01.05.2025
Размер:
238 Кб
Скачать
☆

Алгоритм перевода опз в машинные команды

В общем случае операция R может иметь k операндов.

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

Для трансляции выражения из ОПЗ в машинные команды используется стек операндов (СО) с указателем i. В исходном состоянии стек пуст, а указатель i=1. Будем также считать, что в исходном состоянии номер первой свободной рабочей переменной j=1.

Блок-схема алгоритма перевода:

Для блока 9 используется заранее подготовленные группы машинных команд, в которые требуется лишь подставить адреса операндов (или значения самоопределенных операндов), взятые из стека операндов.

Эту подстановку выполняет подпрограмма, соответствующая операции R и типам ее операндов.

Например, одна подпрограмма соответствует операции сложения вещественных чисел, а другая – операции сложения целых.

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

Машинно-независимые особенности компиляторов

Распределение памяти

Разбиение программы на блоки

Машинно-зависимые особенности компиляторов

Они связаны с программами генерации и оптимизации объектного кода.

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

Одной из таких форм является представление с помощью тетрад.

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

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

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

После оптимизации на уровне четвёрок модифицированная последовательность этих четвёрок должна транслироваться в машинные коды.

Представим «нашу» программу с помощью четвёрок:

1

:=

#0

SUM

{SUM := 0}

2

:=

#0

SUMSQ

{SUMSQ := 0}

3

:=

#1

I

{FOR I:=1 TO 100}

4

JGT

I

#100

(15)

5

CALL

XREAD

{READ (VALUE)}

6

PARAM

VALUE

7

+

SUM

VALUE

i1

{SUM:=SUM+VALUE}

8

:=

i1

SUM

9

*

VALUE

VALUE

i2

{SUMSQ:=SUMSQ+VALUE*VALUE}

10

+

SUMSQ

i2

i3

11

:=

i3

SUMSQ

12

+

I

#1

i4

{конец цикла FOR}

13

:=

i4

I

14

J

(4)

15

DIV

SUM

#100

i5

{MEAN:=SUM DIV 100}

16

:=

i5

MEAN

17

DIV

SUMSQ

#100

i6

{VARIANCE:=SUMSQ DIV

18

*

MEAN

MEAN

i7

100 – MEAN * MEAN}

19

-

i6

i7

i8

20

:=

i8

VARIANCE

21

CALL

XWRITE

{WRITE (MEAN,VARIANCE)}

22

PARAM

MEAN

23

PARAM

VARIANCE

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

Операция JGT (4) сравнивает значение двух своих операндов и осуществляет переход к четверке 15, если 1-ый операнд больше 2-го. Операция J в четвёрке (14) осуществляет переход к четвёрке (4).