В компиляторах и интерпретаторах протекают схожие процессы преобразования исходного текста. Несмотря на то, что взаимодействие этих процессов может быть организовано различным путем, можно выделить функции, выполнение которых приводит к одинаковым результатам. Учитывая схожесть процессов, рассмотрим фазы, существующие в компиляторе.
Основные функции компилятора:
1) проверка исходной цепочки символов на принадлежность к входному языку;
2) генерация выходной цепочки символов на языке машинных команд или ассемблере.
Процесс компиляции состоит из двух основных этапов: анализа и синтеза. На этапе анализа выполняется распознавание текста исходной программы и заполнение таблиц идентификаторов. Результатом этапа служит некоторое внутреннее представление программы, понятное компилятору.
На этапе синтеза на основании внутреннего представления программы и информации, содержащейся в таблицах идентификаторов, порождается текст результирующей программы. Результатом этого этапа является объектный код.
Данные этапы состоят из более мелких стадий, называемых фазами. Состав фаз и их взаимодействие зависит от конкретной реализации компилятора. Но в том или ином виде в каждом компиляторе выделяются следующие фазы:
Общая схема работы компилятора представлена на рисунке 4.1.
Рисунок 4.1 – Общая схема работы компилятора
Определение 4.5. Процесс последовательного чтения компилятором данных из внешней памяти, их обработки и помещения результатов во внешнюю память, называется проходом компилятора.
По количеству проходов выделяют одно-, двух-, трех- и многопроходные компиляторы.