Многопроходный компилятор

редактировать

Многопроходной компилятор представляет собой тип компилятора, который обрабатывает исходный код или абстрактное синтаксическое дерево программы несколько раз. В этом отличие от однопроходного компилятора, который проходит программу только один раз. Каждый проход принимает на входе результат предыдущего прохода и создает промежуточный вывод. Таким образом, (промежуточный) код улучшается от прохода к проходу, пока на последнем проходе не будет получен окончательный код.

Многопроходные компиляторы иногда называют широкими компиляторами, имея в виду больший объем проходов: они могут «видеть» всю компилируемую программу, а не только ее небольшую часть. Таким образом, более широкий диапазон, доступный этим компиляторам, позволяет лучше генерировать код (например, меньший размер кода, более быстрый код) по сравнению с выводом однопроходных компиляторов за счет более длительного времени компиляции и потребления памяти. Кроме того, некоторые языки не могут быть скомпилированы за один проход из-за их конструкции.

СОДЕРЖАНИЕ
  • 1 Типичный многопроходный компилятор
    • 1.1 Лексический анализ
    • 1.2 Синтаксический анализ
    • 1.3 Семантический анализ
    • 1.4 Генерация кода
  • 2 Преимущества многопроходных компиляторов
  • 3 ссылки
Типичный многопроходный компилятор
Multi-passcompiler.png

Лексический анализ

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

Синтаксический анализ

Анализ синтаксиса отвечает за рассмотрение синтаксических правил языка (часто в виде контекстно-свободной грамматики ) и построение некоторого промежуточного представления языка. Примером этого промежуточного представления может быть что-то вроде абстрактного синтаксического дерева или направленного ациклического графа.

Семантический анализ

Семантический анализ берет представление, созданное на основе синтаксического анализа, и применяет семантические правила к представлению, чтобы убедиться, что программа соответствует требованиям семантических правил языка. Например, в приведенном ниже примере на этапе семантического анализа, если язык требует, чтобы условия для операторов if были булевыми выражениями, cond будет проверяться на тип, чтобы убедиться, что это допустимое логическое выражение.

if(cond) {... } else {... }

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

Генерация кода

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

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

Преимущества многопроходных компиляторов

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

Более выразительные языки: несколько проходов устраняют необходимость в предварительных объявлениях, позволяя элегантно реализовать взаимную рекурсию. Основные примеры языков, требующих форвардных объявлений из-за необходимости компилирования за один проход, включают C и Pascal, тогда как Java не имеет форвардных объявлений.

Рекомендации
Последняя правка сделана 2023-03-19 09:40:14
Содержание доступно по лицензии CC BY-SA 3.0 (если не указано иное).
Обратная связь: support@alphapedia.ru
Соглашение
О проекте