Генератор кода

Генератор кода «развертывает» атомы, построенные синтаксическим блоком в последовательность команд ЭВМ. Характер развертывания зависит от элементов таблицы, на которые ссылаются атомы, а также от ожидаемого состояния машины в момент выполнения команд.

Пример: Для атома умнож (B, C, R1) развертка зависит от типа операндов В и С, места, где хранятся операнды, и содержимого регистров машины. Целые операнды требуют умножения с фиксированной точкой, операнды с плавающей точкой – умножения с плавающей точкой, смешанные – требуют команд преобразования типов.

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

Часть работы компилятора, которая связана со смыслом лексем, называется семантической обработкой. Семантический блок часто помещают между синтаксическим блоком и генератором кода.

Пример: Семантика идентификатора может включать его тип, а в случае, если это массив, то и его размерность.

Семантическая обработка может быть разных видов и зависит от типа транслятора. В случае построения компилятора различают два вида семантической обработки:

1) занесение в таблицу имен свойств отдельных идентификаторов по мере их появления;

2) действия, зависящие от типа данных.

Пример: При развертывании атома умнож (В, С, R1) генератор кода порождает команды с фиксированной точкой или с плавающей в зависимости от операндов.

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

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

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

Эффект блока оптимизации часто состоит в переупорядочивании атомов.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: