Компилятор представляет собой комбинацию многих программ. Какая программа заботится о какой части во время компиляции? Я где-то читал, что препроцессорная программа заботится о директивах препроцессора C (макросы). Это верно?
Ничто не говорит о том, как компилятор должен / должен быть спроектирован внутренне, поэтому он будет отличаться от компилятора к компилятору.
Традиционно, однако, они делятся на препроцессор, компилятор и компоновщик. Они могут быть внутри одного исполняемого файла или в нескольких.
Препроцессор делает все, что нужно сделать, прежде чем компилятор начнет проверять фактический синтаксис языка. Компилятор проверяет, является ли источник верным C, имеет ли это смысл? А затем переводит исходный код в исполняемую программу, которая ведет себя так, как указано в стандарте C.
Некоторые компиляторы выдают выходные данные в форме аппаратно-независимого «объектного файла», и в этом случае для преобразования одного или нескольких объектных файлов в машинный код требуется компоновщик. Но компилятор также может выдавать вывод в виде машинного кода, и в этом случае единственной задачей компоновщика является размещение всех различных частей (переводческие единицы) программы вместе, включая библиотеки, и проверьте, все ли идентификаторы (переменные, функции и т. д.), используемые программой, присутствуют — если нет, вы получите ошибку компоновщика.
Стандарт C (C17 5.1.1.2) говорит только о этапы перевода, который в основном диктует порядок предварительной обработки. Грубо говоря, фазы перевода с 1 по 6 — это то, что мы бы назвали «предварительной обработкой», шаг 7 — это «компиляция», а шаг 8 — «связывание».
Других решений пока нет …