Структура Многопроходных Компиляторов
Существование многопроходных компиляторов языков программирования объясняется различными причинами. К их числу можно отнести ограниченность ресурса памяти, свойства входного языка или специфику алгоритмов компиляции. Оперативная память разделяется между программами, входящими в компилятор, и данными (компилируемой программой). Конкретные потребности в оперативной памяти определяются сложностью (объемом) компонентов. Сложность программ компилятора, в свою очередь, определяется сложностью входного языка и глубиной обработки (степенью возможной оптимизации) программы. Сложность компилируемой программы определяется как количеством строк, так и количеством программных объектов (идентификаторов). Увеличение верхних пределов этих величин, в свою очередь, расширяет возможности оптимизации за счет учета межпроцедурных взаимодействий.
Компилятор, обладающий вышеуказанными свойствами, должен иметь, тем не менее, удовлетворительные эксплуатационные характеристики по времени компиляции и ресурсам оперативной и внешней памяти. В настоящей работе описана структура многопроходного компилятора с точки зрения использования памяти в процессе компиляции. В качестве критерия оценки эксплуатационных характеристик выбрано суммарное количество обменов с внешней памятью.
Основное внимание в работе уделяется управляющей части компилятора, в частности — структурами данных, предоставляемых управляющей частью компилятора остальным компонентам (базовым структурам данных). В качестве примеров реализации описанной схемы обсуждаются кросс-компилятор ПЛ/1, прямой компилятор Фортрана для векторно-конвейерной ЭВМ (ВК ЭВМ) и Паскаль-компилятор для ВК ЭВМ. Поскольку выбранная схема оказалась достаточно общей, ее удалось применить также для реализации имитационного комплекса специализированного микропроцессора (транслятор с автокода, загрузчик, интерпретатор).
Программные модули, входящие в компилятор, разделяются на два класса:
1) базовые модули (управляющий модуль, модуль начального пуска, итоговая печать сообщений);
2) функциональные модули, реализующие конкретные алгоритмы обработки информации. Базовые программные модули составляют незначительную часть от общего объема компилятора. Именно базовые модули являются предметом дальнейшего рассмотрения.
