Распределение памяти
Разбиение программы на блоки
Машинно-зависимые особенности компиляторов
Они связаны с программами генерации и оптимизации объектного кода.
Оптимизация, связанная с распределением регистров и перестановкой команд, обычно осуществляется с использованием промежуточной формы представления программы. В этой форме синтаксис и семантика исходной программы уже полностью проанализированы, но трансляция в машинные команды ещё не осуществлена.
Одной из таких форм является представление с помощью тетрад.
Эти тетрады могут быть сгенерированы программами генерации промежуточного представления (аналогичными тем, которые были рассмотрены ранее для генерации кода).
Для исключения ненужных операций запоминания и загрузки регистров можно изменить порядок следования тетрад.
Промежуточные результаты ij можно запомнить в рабочих переменных или регистрах, чтобы обеспечить их эффекивное использование.
После оптимизации на уровне четвёрок модифицированная последовательность этих четвёрок должна транслироваться в машинные коды.
|
|
Представим «нашу» программу с помощью четвёрок:
:= | #0 | SUM | {SUM:= 0} | ||
:= | #0 | SUMSQ | {SUMSQ:= 0} | ||
:= | #1 | I | {FOR I:=1 TO 100} | ||
JGT | I | #100 | (15) | ||
CALL | XREAD | {READ (VALUE)} | |||
PARAM | VALUE | ||||
+ | SUM | VALUE | i1 | {SUM:=SUM+VALUE} | |
:= | i1 | SUM | |||
* | VALUE | VALUE | i2 | {SUMSQ:=SUMSQ+VALUE*VALUE} | |
+ | SUMSQ | i2 | i3 | ||
:= | i3 | SUMSQ | |||
+ | I | #1 | i4 | {конец цикла FOR} | |
:= | i4 | I | |||
J | (4) | ||||
DIV | SUM | #100 | i5 | {MEAN:=SUM DIV 100} | |
:= | i5 | MEAN | |||
DIV | SUMSQ | #100 | i6 | {VARIANCE:=SUMSQ DIV | |
* | MEAN | MEAN | i7 | 100 – MEAN * MEAN} | |
- | i6 | i7 | i8 | ||
:= | i8 | VARIANCE | |||
CALL | XWRITE | {WRITE (MEAN,VARIANCE)} | |||
PARAM | MEAN | ||||
PARAM | VARIANCE |
Списки параметров для READ и WRITE представлены в виде четверок PARAM. При дальнейшей генерации кода они будут преобразованы в команды занесения параметров в стек.
Операция JGT (4) сравнивает значение двух своих операндов и осуществляет переход к четверке 15, если 1-ый операнд больше 2-го. Операция J в четвёрке (14) осуществляет переход к четвёрке (4).