Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 700383.doc
Скачиваний:
15
Добавлен:
01.05.2022
Размер:
4.33 Mб
Скачать

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

Для рассмотрения технических вопросов реализации основных фаз компиляции, необходимо познакомиться с понятием прохода.

Реальные компиляторы, как правило, выполняют трансляцию текста исходной программы за несколько проходов.

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

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

В качестве внешней памяти могут выступать любые носители информации:

  • оперативная память компьютера;

  • накопители на магнитных дисках;

  • накопители на магнитных лентах и т. п.

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

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

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

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

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

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

Однако сократить число проходов не всегда удается. Количество необходимых проходов определяется прежде всего грамматикой и семантическими правилами исходного языка. Чем сложнее грамматика языка и чем больше вариантов пред­полагают семантические правила - тем больше проходов будет выполнять компилятор (конечно, играет свою роль и квалификация разработчиков компилятора). Например, именно поэтому обычно компиляторы с языка Pascal работают быстрее, чем компиляторы с языка С - грамматика Pascal более проста, а семантические правила более жесткие.

Реальные компиляторы выполняют, как правило, от двух до пяти проходов. Таким образом, реальные компиляторы являются многопроходными.

Наиболее распространены двух- и трехпроходные компиляторы, например, выполняющие следующие проходы:

  1. лексический анализ;

  2. синтаксический разбор и семантический анализ;

  3. генерацию и оптимизацию кода.

В современных системах программирования нередко первый проход компилятора (лексический анализ кода) выполняется параллельно с редактированием кода исходной программы.