Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Все_пособие_редактир.doc
Скачиваний:
175
Добавлен:
31.10.2018
Размер:
2.51 Mб
Скачать

1.3 Понятие прохода. Однопроходные и многопроходные компиляторы

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

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

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

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

1.4 Фазы компилятора

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

Рис. 1. Фазы компилятора

На практике некоторые фазы могут быть сгруппированы вместе и промежуточные представления программы внутри таких групп могут явно не строиться. Управление таблицей символов и обработка ошибок пока­заны во взаимодействии с шестью фазами: лексическим анализом, синтаксическим ана­лизом, семантическим анализом, генерацией промежуточного кода, оптимизацией кода и генерацией кода. Неформально диспетчер таблицы символов и обработчик ошибок так­же могут считаться "фазами" компилятора.

1.5 Управление таблицей символов

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

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

Если лексическим анализатором в исходной программе обнаружен идентификатор, он записывается в таблицу символов. Однако атрибуты идентификатора обычно не могут быть определены в процессе лексического анализа. Например, в объявлении переменных на языке Pascal

Var name1, name2, name3: real;

когда лексический анализатор находит идентификаторы name1, name2, name3, их тип real еще неизвестен.

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