Компьютер понимает биты, состоящие из единиц и нулей (машинный код). Однако люди общаются на человеческом языке. Как восполнить этот пробел? Компилятор! Компилятор преобразует высокоуровневый (программный) код программиста в низкоуровневый машинный язык.

Возьмем в качестве примера компилятор gcc. gcc означает сборник компиляторов GNU. Для наших целей давайте рассмотрим это как компилятор C с файлом main.c в качестве исходного файла.

gcc создаст окончательный исполняемый файл программного обеспечения в четыре этапа:

1. Предварительная обработка (для расширения любых макросов)

2. Компиляция (из исходного кода в сборку)

3. Ассемблирование (от языка ассемблера к машинному коду)

4. Связывание (для создания исполняемого файла)

Чтобы скомпилировать программу, пользователь может просто ввести gcc main.c, чтобы сгенерировать исполняемый файл a.out. Все, что происходит между предыдущим оператором и конечным файлом a.out, невидимо для программиста. На первом этапе, Предварительной обработке, расширяются любые макросы, а также заголовочные файлы. Будет создан файл main.i, но он недоступен для просмотра, если не используется параметр -save-temps. Более подробную информацию о макросах можно найти здесь, https://gcc.gnu.org/onlinedocs/cpp/Macros.html. Заголовочные файлы можно найти здесь, https://gcc.gnu.org/onlinedocs/gcc-3.0.2/cpp_2.html

На втором этапе, Компиляция, код из этапа 1 преобразуется в код сборки для определенного микропроцессора или типа ЦП, например, производимых Intel, AMD и другими. Результатом является файл main.s.

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

На последнем этапе компоновщик создает окончательный исполняемый файл, заполняя ссылки в объектном файле на другие библиотеки. По умолчанию имя файла — a.out. Однако, если пользователь изначально ввел «gcc main.c -o main», тогда исполняемый файл становится файлом с именем «main».

Для тех, кто действительно хочет увидеть, как компилятор gcc творит чудеса, в gcc есть подробная опция «gcc -v», которая более подробно покажет процесс компиляции.