Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Glava14 r.doc
Скачиваний:
2
Добавлен:
01.07.2025
Размер:
548 Кб
Скачать
☆

Способы внутреннего представления программ

Возможны различные формы внутреннего представления синтаксических конструкций исходной программы в компиляторе. Ha этапе синтаксического разбора часто используется форма, именуемая деревом вывода (методы его построения рассматривались выше). Ho формы представления, используемые на этапах синтаксического анализа, оказываются неудобными в работе при генерации и оптимизации объектного кода. Поэтому перед оптимизацией и непосредственно перед генерацией объектного кода внутреннее представление программы может преобразовываться в одну из соответствующих форм записи. Все внутренние представления программы обычно содержат в себе две принципиально различные вещи — операторы и операнды. Различия между формами внутреннего представления заключаются лишь в том, как операторы и операнды соединяются между собой. Также операторы и операнды должны отличаться друг от друга, если они встречаются в любом порядке. За различение операндов и операторов, как уже было сказано выше, отвечает разработчик компилятора, который руководствуется семантикой входного языка. Известны следующие формы внутреннего представления программ1: а связочные списочные структуры, представляющие синтаксические деревья; а многоадресный код с явно именуемым результатом (тетрады); Q многоадресный код с неявно именуемым результатом (триады); Q обратная (постфиксная) польская запись операций; Q ассемблерный код или машинные команды.

B каждом конкретном компиляторе может использоваться одна из этих форм, выбранная разработчиками. Ho чаще всего компилятор не ограничивается ис-

1 Существуют три формы записи выражений — префиксная, инфиксная и постфиксная. При префиксной записи операция записывается перед своими операндами, при инфиксной — между операндами, а при постфиксной — после операндов. Общепринятая запись арифметических выражений является примером инфиксной записи. Запись математических функций и функций в языках программирования является префиксной (другие примеры префиксной записи — команды ассемблера, триады и тетрады, в том виде, как они рассмотрены далее). Постфиксная запись в повседневной жизни встречается редко. C нею сталкиваются разве что пользователи стековых калькуляторов и программисты на языке Forth.

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

Некоторые компиляторы, незначительно оптимизирующие результирующий код, генерируют объектный код по мере разбора исходной программы. B этом случае применяется схема СУ-компиляции, когда фазы синтаксического разбора, семантического анализа, подготовки и генерации объектного кода совмещены в одном проходе компилятора. Тогда внутреннее представление программы существует только условно в виде последовательности шагов алгоритма разбора. B любом случае компилятор всегда будет работать с представлением программы в форме машинных команд — иначе он не сможет построить результирующую программу. Далее все перечисленные формы представления рассматриваются более подробно.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]