Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Теория языков программирования и методы трансляции..pdf
Скачиваний:
28
Добавлен:
05.02.2023
Размер:
3.41 Mб
Скачать

185

7 ПРОЕКТИРОВАНИЕ КОМПИЛЯТОРОВ

7.1 ЧИСЛО ПРОХОДОВ

Разработчики компиляторов находят идею однопроходного компиля-

тора привлекательной, так как не надо заботиться о связях между проходами,

промежуточных языках и т.д. Кроме того, нет трудностей в ассоциировании ошибок программы с исходным тестом. Однако вопрос о количестве прохо-

дов неоднозначен [2]. Прежде всего, надо определить, что мы будем считать проходом.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Если какая-либо фаза процесса компиляции требует полно-

го прочтения текста, то это обычно называют проходом.

· · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Проходы бывают прямыми или обратными, т.е. за один проход исход-

ный текст можно считать слева направо или справа налево.

Большинство языков, использующих идею описания переменных до их первого использования (Pascal, C++ и др.) либо использующих принцип умолчания, в принципе могут быть однопроходными. Однако есть ряд осо-

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

Особенно ясно это можно продемонстрировать на проблеме компиляции вза-

имно рекурсивных процедур. Допустим, что тело процедуры A содержит вы-

зов процедуры B, а процедура B содержит вызов процедуры A. Если проце-

дура A объявляется первой, то компилятор не будет генерировать код для вы-

зова B внутри A, не зная типов параметров B, и, в случае процедуры, возвра-

щающей результат, тип этого результата может потребоваться для идентифи-

кации обозначения операции. Единственное разумное решение данной про-

блемы – позволить компилятору сделать дополнительный проход перед гене-

рацией кода.