- •Генерация кода
- •Алгоритм перевода опз в машинные команды
- •1. Назначение и распределение регистров.
- •2. Переупорядочение четверок
- •3. Использование специфических особенностей платформы
- •Машинно-независимая оптимизация кода
- •1. Удаление общих подвыражений
- •4. Свёртка операндов
- •5. Короткое вычисление выражений
- •6. Сдвиг вместо умножения
- •2. Удаление инвариантов цикла
- •3. Замена операций на более эффективные
Алгоритм перевода опз в машинные команды
В общем случае операция 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).
