Что происходит, когда вы вводите gcc main.c в окно терминала?

Команда gcc main.c — это команда для компиляции программы с именем main.c.

  1. Bash ищет любые псевдонимы для строки gcc
  2. Bash ищет в переменной $PATH каталоги, в которых хранятся исполняемые файлы.
  3. Bash выполняет команду gcc на main.c. gcc — это компилятор. Скомпилировать программу означает преобразовать текстовый файл, написанный для понимания человеком, в двоичные биты, которые компьютер может понять и вычислить результаты. Этот процесс состоит из нескольких различных частей:

3.а. Сначала текст, содержащийся в main.c, проходит через прекомпилятор, программу, которая вставляет содержимое другого файла. Этот файл упоминается в первой строке main.c. Он объявляется строкой, которая может выглядеть так: #include <stdio.h> . Прекомпилятор просматривает библиотечные файлы, написанные на C, и извлекает содержимое файла stdio.h для вставки в начало текстового файла. Прекомпилятор также удаляет все комментарии и заменяет любые макросы кодом. Весь текст между /**/ является комментарием и не предназначен для компиляции с остальной частью кода. Комментарии предназначены для пояснения частей кода, на которые разработчики могут ссылаться. Макрос может выглядеть так #define BUFFER_SIZE 1024. #define объявляет, что будет макрос. BUFFER_SIZE — это имя макроса, а 1024 — это текст, который заменит каждый экземпляр текста BUFFER_SIZE.

3.б. После замены библиотек и макросов и удаления препроцессором комментариев код (по-прежнему написанный на C, но расширенный) готов к следующему шагу, также называемому компиляцией. Этот шаг преобразует код C в ассемблерный код.

3.в. Только что преобразованный ассемблерный код затем передается в ассемблер, который преобразует код в объектный код (также называемый объектным кодом). Результатом этого процесса является двоичный код, который может быть выполнен компьютером.

3.д. Заключительный этап процесса компиляции проходит через компоновщик, который связывает код из любых библиотек, на которые есть ссылки в исходном исходном коде, заменяя ссылки на функции кодом из библиотеки. Результатом этой заключительной фазы является исполняемая программа, которую можно запустить на процессоре.

4. После компиляции main.c оболочка Bash выводит переменную $PS1 на стандартный вывод, а затем ждет, пока пользователь введет другую строку.

По умолчанию имя файла a.out , и его можно запустить следующим образом: ./a.out