Генератор кода «развертывает» атомы, построенные синтаксическим блоком в последовательность команд ЭВМ. Характер развертывания зависит от элементов таблицы, на которые ссылаются атомы, а также от ожидаемого состояния машины в момент выполнения команд.
Пример: Для атома умнож (B, C, R1) развертка зависит от типа операндов В и С, места, где хранятся операнды, и содержимого регистров машины. Целые операнды требуют умножения с фиксированной точкой, операнды с плавающей точкой – умножения с плавающей точкой, смешанные – требуют команд преобразования типов.
Чтобы порождаемый код был эффективен, часто требуется производить анализ содержимого регистров машины в период выполнения программы. Это позволяет избежать повторной загрузки уже доступной информации и выбрать подходящие регистры для хранения переменных, промежуточных результатов и разнообразной изменяемой информации. Выбор конкретной схемы работы с регистрами зависит от типа ЭВМ.
Часть работы компилятора, которая связана со смыслом лексем, называется семантической обработкой. Семантический блок часто помещают между синтаксическим блоком и генератором кода.
Пример: Семантика идентификатора может включать его тип, а в случае, если это массив, то и его размерность.
Семантическая обработка может быть разных видов и зависит от типа транслятора. В случае построения компилятора различают два вида семантической обработки:
1) занесение в таблицу имен свойств отдельных идентификаторов по мере их появления;
2) действия, зависящие от типа данных.
Пример: При развертывании атома умнож (В, С, R1) генератор кода порождает команды с фиксированной точкой или с плавающей в зависимости от операндов.
В случае препроцессора семантическая обработка может заключаться в построении внутренней структуры предложения исходного языка, например в виде семантического графа или деревьев составляющих.
Часть компилятора, которая позволяет получать более эффективные объектные программы, называют оптимизатором. В некоторых компиляторах роль оптимизации так велика, что между синтаксическим (или семантическим, если он есть) блоком и генератором кода помещают специальный блок оптимизации.
Например, присутствие такого блока может быть желательным, если нужно выделять расположенные внутри цикла вычисления, результаты которых в ходе выполнения цикла не меняются, и выполнять эти вычисления один раз до входа в цикл.
Эффект блока оптимизации часто состоит в переупорядочивании атомов.