Распределение памяти
Разбиение программы на блоки
Машинно-зависимые особенности компиляторов
Они связаны с программами генерации и оптимизации объектного кода.
Оптимизация, связанная с распределением регистров и перестановкой команд, обычно осуществляется с использованием промежуточной формы представления программы. В этой форме синтаксис и семантика исходной программы уже полностью проанализированы, но трансляция в машинные команды ещё не осуществлена.
Одной из таких форм является представление с помощью тетрад.
Эти тетрады могут быть сгенерированы программами генерации промежуточного представления (аналогичными тем, которые были рассмотрены ранее для генерации кода).
Для исключения ненужных операций запоминания и загрузки регистров можно изменить порядок следования тетрад.
Промежуточные результаты 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).






