Содержание

Фазы трансляции

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

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

Далее следуют фазы трансляции:

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

Финальная фаза обычно происходит вне фазы компиляции. Во время этой фазы, часто называемой фазой линкования (редактирования связей), разрешаются все ссылки на определения внешних объектов, и создаётся образ исполняемой программы. Созданный образ содержит всю необходимую информацию для исполнения программы в соответствующем окружении.