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

Но как это сделать компьютеру?

Если исходная программа была написана на языке программирования C, необходим компилятор. Компилятор анализирует программу, разработанную на определенном языке программирования, а затем переводит ее в форму, пригодную для выполнения в вашей конкретной компьютерной системе.

GCC расшифровывается как «Коллекция компиляторов GNU». GCC — это интегрированный дистрибутив компиляторов для нескольких основных языков программирования. Эти языки в настоящее время включают C, C++, Objective-C, Objective-C++, Java, Fortran и Ada.

На следующем рисунке показаны шаги, связанные с вводом, компиляцией и выполнением компьютерной программы, разработанной на языке программирования C.

Предварительная обработка

На первом этапе процесса компиляции компилятор проверяет каждый оператор программы, содержащийся в исходной программе, и проверяет его на соответствие синтаксису и семантике языка. Если на этом этапе компилятор обнаружит какие-либо ошибки, о них будет сообщено пользователю, и процесс компиляции тут же завершится.

Используя флаг gcc «-E», мы можем напрямую выполнить операцию предварительной обработки.

[bash]$ gcc -E main.c -o вывод файла

Подборка

Когда все синтаксические и семантические ошибки были удалены из программы, компилятор затем берет каждое выражение программы и переводит его в «нижнюю» форму. Выходной файл для этого этапа создает код сборки, который зависит от машины.

Используя флаг «-S» с gcc, мы можем преобразовать исходный код файла в язык ассемблера без создания объектного файла:

[bash]$ gcc -S main.c -o fileOutput.s

Сборка

После того, как программа была переведена в эквивалентную программу на языке ассемблера, следующим шагом в процессе компиляции является преобразование операторов языка ассемблера в реальные машинные инструкции.

Ассемблер берет каждый оператор языка ассемблера и преобразует его в двоичный формат, известный как объектный код, который затем записывается в другой файл в системе. Этот файл обычно имеет то же имя, что и исходный файл в Unix, с последней буквой «o» (для объекта) вместо «c».

Используя флаг «-c» в gcc, мы можем преобразовать ассемблерный код в код машинного уровня:

[bash]$ gcc -c main.c -o fileOutput.o

Связывание

После того, как программа переведена в объектный код, она готова к компоновке. Этот процесс снова выполняется автоматически всякий раз, когда в Unix запускается команда cc или gcc. Целью этапа компоновки является приведение программы в окончательную форму для выполнения на компьютере. Если в программе используются другие программы, ранее обработанные компилятором, то на этом этапе программы компонуются между собой. Программы, которые используются из библиотеки программ системы, также ищутся и связываются вместе с объектной программой на этом этапе.

Окончательный связанный файл в формате исполняемого объектного кода хранится в другом файле в системе и готов к запуску или выполнению. В Unix этот файл по умолчанию называется a.out. В Windows исполняемый файл обычно имеет то же имя, что и исходный файл, с заменой расширения c на расширение exe.

Весь процесс компоновки обрабатывается gcc и вызывается следующим образом:

[bash]$ gcc main.c -o Вывод