Компиляция программы - процесс преобразования исходного текста программы в исполнимый модуль, состоящий из машинных команд.
Компилятор языка Си - составная часть операционной системы, например,
ОС UNIX, которая выполняет компиляцию программы, написанной на языке программирования Си.
На рис.1 представлены шаги, через которые проходит программа на Си при ее компиляции.
Рис. 1. Шаги компиляции Си
На первом шаге программа "препроцессируется". Специальные директивы обрабатываются
препроцессором. Результат этой обработки - расширенный исходный текст программы на языке Си.
На следующем шаге программа действительно компилируется и переводится на низкоуровневый язык ассемблера.
Затем ассемблер транслирует ассемблерную программу в объектный код. Хотя объектный код - это машинный код, он еще невыполним.
Исполняемый код строит программа - компоновщик, называемая в ОС UNIX редактором связей. Одна из задач редактора связей состоит в согласовании неразрешенных ссылок.
Неразрешенная ссылка - ссылка на объект, который в данной части программы неопределен. Редактор связей связывает
объявления внешних переменных с соответствующими
внешними определениями. Другим типом неразрешенной ссылки является
вызов функции, не определенной в программе, например, вызов функции printf(). Редактор связей ищет объектный код функции в одной или более библиотеках и включает этот код в исполнимый модуль. Результатом работы редактора связей при отсутствии ошибок является исполнимая программа.
В системе ОС UNIX процесс компиляции может быть остановлен после любого шага путем использования соответствующего
флага команды cc, который определяет режим работы команды. Создается файл с тем же именем, что и исходный файл, и окончанием
.i,
.s или
.o, указывающем на тип файла. По умолчанию имя исполнимой программы -
a.out.
Пример 1
cc -E -o proc.i prog.c
При выполнении этой команды компиляция останавливается после работы препроцессора. Создается файл с окончанием .i. Этот режим используется при отладке для контроля подстановок препроцессора.
Пример 2
cc -S prog.c
или
cc -S prog.i
При выполнении этих команд компиляция останавливается перед ассемблированием. Создается файл с окончанием .s, содержащий ассемблерную программу.
Пример 3
cc -c prog.c
или
cc -c prog.s
При выполнении этих команд компиляция останавливается перед редактированием связей. Создается файл с окончанием
.o. Этот режим используется при компиляции файлов, множество которых не является завершенной программой, например, файлов, не содержащих
функцию main().
Любой из этих типов файлов может быть использован как аргумент команды cc системы ОС UNIX. При этом определяется, через какие шаги компиляции прошел файл, так что шаги не повторяются. В прим. 4 приводятся правильные команды cc, создающие исполняемые файлы, если не было ошибок.
Пример 4
cc prog.i
cc file1.i file2.c file3.o