Содержание
Фазы трансляции
Этот раздел описывает последовательность шагов, которые предпринимает
компилятор C во время трансляции исходных файлов. Большинству программистов
не обязательно знать их в совершенстве, так как они достаточно наглядны.
Однако в редких случаях может понадобиться сделать проверку для разрешения
проблем связанных с процессом трансляции.
Даже если шаги трансляции показаны в отдельных фазах, компилятор может их
объединять. Однако это должно быть прозрачным для пользователя.
Далее следуют фазы трансляции:
-
Символы исходного файла(ов) транслируются в символы исходного символьного
набора. Символы, обозначающие конец строки в файловой системе, при
необходимости транслируются в символы новой строки. Триграфы заменяются на
соответствующие символы.
-
Физические исходные строки объединяются вместе, если строка оканчивается
обратной косой чертой (
\
). Это происходит после удаления
\
и символа новой строки, что создаёт из этой и следующей строки
более длинную.
-
Исходный файл разбивается на лексемы препроцессора и пробельные символы
(пробелы и табуляции), включая комментарии. Лексемой является самая длинная
последовательность символов, которая может быть лексемой. Каждый комментарий
заменяется одним символом пробела. Символы новой строки в данный момент
сохраняются.
-
Выполняются директивы препроцессора, производятся макроподстановки.
Заголовочный файл указанный в директиве
#include
обрабатывается
по правилам пунктов с 1 по 4.
-
Члены исходного символьного набора и эскейп-последовательности в
символьных константах и стринговых литералах конвертируются в одиночные
символы набора времени исполнения.
-
Соседние лексемы стринговых литералов и соседние лексемы расширенных
стринговых литералов объединяются.
-
Пробельные символы, разделяющие лексемы более не имеют значимости.
Лексемы препроцессора конвертируются в лексемы языка. Лексемы транслируются в
соответствии с синтаксическими и семантическими правилами.
Финальная фаза обычно происходит вне фазы компиляции. Во время этой фазы,
часто называемой фазой линкования (редактирования связей), разрешаются
все ссылки на определения внешних объектов, и создаётся образ исполняемой
программы. Созданный образ содержит всю необходимую информацию для исполнения
программы в соответствующем окружении.