Системное программное обеспечение: Основы трансляции. Карпушин А.Н - 27 стр.

UptoLike

29
все фазы компиляции и получает результатобъектный код. В другом вариан-
те он выполняет над исходным текстом только некоторые из фаз компиляции и
получает не конечный результат, а набор некоторых промежуточных данных.
Эти данные затем снова подвергаются обработке, причем этот процесс может
повторяться несколько раз.
Проход это процесс последовательного чтения компилятором данных из
внешней памяти, их обработки и помещения результата работы во внешнюю
память. Чаще всего один проход включает в себя выполнение одной или не-
скольких фаз компиляции. Результатом промежуточных проходов является
внутреннее представление исходной программы, результатом последнего про-
ходарезультирующая объектная программа.
При выполнении каждого прохода компилятору доступна информация, по-
лученная в результате всех предыдущих проходов. Как правило, он стремится
использовать в первую очередь только информацию, полученную на проходе,
непосредственно предшествовавшем текущему, но в принципе может обра-
щаться и к данным от более ранних проходов вплоть до исходного текста про-
граммы. Информация, получаемая компилятором при выполнении проходов,
недоступна пользователю. Она либо хранится в оперативной памяти, которая
освобождается компилятором после завершения процесса трансляции, либо
оформляется в виде временных файлов на диске, которые также уничтожаются
после завершения работы компилятора. Поэтому человек, работающий с ком-
пилятором, может даже не знать, сколько проходов выполняет компиляторон
всегда видит только текст исходной программы и результирующую объектную
программу. Но количество выполняемых проходовэто важная техническая
характеристика компилятора, и фирмыразработчики компиляторов обычно
указывают ее в описании своего продукта.
Понятно, что разработчики стремятся максимально сократить количество
проходов, выполняемых компиляторами. При этом увеличивается скорость ра-
боты компилятора, сокращается объем необходимой ему памяти. Однопроход-
ный компилятор, получающий на вход исходную программу и сразу же порож-
дающий результирующую объектную программуэто идеальный вариант.
Однако сократить число проходов не всегда удается. Количество необхо-
димых проходов определяется, прежде всего, грамматикой и семантическими
правилами исходного языка. Чем сложнее грамматика языка и чем больше ва-
риантов предполагают семантические правилатем больше проходов будет
выполнять компилятор. Например, именно поэтому обычно компиляторы с
языка Pascal работают быстрее, чем компиляторы с языка Сграмматика языка
Pascal более проста, а семантические правила более жесткие.
Однопроходные компиляторыредкость, они возможны только для очень
простых языков. Реальные компиляторы выполняют, как правило, от двух до
пяти проходов. Таким образом, реальные компиляторы являются многопроход-
ными. Наиболее распространены двух- и трехпроходные компиляторы, напри-
мер: первый проходлексический анализ, второйсинтаксический разбор и
семантический анализ, третийгенерация и оптимизация кода (варианты