Чтобы понять GCC и весь процесс компиляции за кулисами, важно сначала поговорить о языке C (только базовом, не волнуйтесь), gcc и о том, что происходит после компиляции файла C.

Язык программирования С

C — это язык программирования, впервые разработанный в 1972 году Деннисом Ритчи из AT&T Bell Labs. Он был назван C, потому что уже существовал язык B, и, что забавно, B руководил разработкой C.

C — это язык высокого уровня, но поскольку некоторые из самых популярных языков высокого уровня, созданных прямо сейчас, во многих отношениях лучше, чем C, некоторые могут назвать C самым низким языком программирования высокого уровня. Языки высокого уровня получили общие преимущества:

  • Читабельность: программы легко читаются.
  • Ремонтопригодность: программы просты в обслуживании.
  • Портативность: программы легко переносятся на разные компьютерные платформы.

Поскольку языки высокого уровня получают непосредственную выгоду от человеческих языков, таких как английский, нам нужны компиляторы или интерпретаторы для перевода инструкций, написанных на языке программирования высокого уровня, на машинный язык, понятный компьютеру. Вот откуда взялся gcc, поскольку это компилятор.

Коллекция компиляторов GNU (GCC)

GCC поддерживает несколько языков, таких как C, C++ и FORTRAN. Но мы собираемся поговорить о компиляторе gcc для C. Теперь, чтобы понять, как его использовать, нам нужно понять процесс компиляции.

Процесс компиляции

Компиляция — это процесс, который транслирует исходный код (код, который мы пишем) в объектный код (машинный язык) компилятором. В этом случае gcc.

Давайте запишем это:

  • Препроцессор (препроцессор)
  • Компилятор (компиляция)
  • Ассемблер (сборка)
  • Линкер (связывание)

Для запуска процесса нам понадобится компилятор gcc и исходный код. Давайте немного поговорим об исходном коде, который мы собираемся использовать.

Исходный код

Как мы уже говорили ранее, исходный код — это код, который мы пишем на нашем языке, используя функции и переменные.

Итак, это наш исходный код. У нас есть заголовочные файлы (библиотека), комментарии и, наконец, наша программа. Этот исходный код будет называться «main.c». Это имя по умолчанию для примера. Чтобы уточнить, «.c» — это расширение для языковых файлов C. И мы собираемся преобразовать это расширение в процессе компиляции. Для этого нам нужно будет использовать команду gcc и написать название нашего исходного кода. Это должно выглядеть так:

После этого файл пройдет этапы процесса.

Четыре шага процесса компиляции

ШАГ 1. Препроцессор

Это первый шаг процесса компиляции. Здесь компилятор берет что-то и передает другое. Мы можем определить это в трех вещах:

  • Он избавится от комментариев, которые вы сделали в исходном коде.
  • В него войдут те заголовочные файлы (библиотеки), которые вы вызывали в исходном коде.
  • Препроцессор заменит макросы их определениями во всей программе.

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

ШАГ 2. Компиляция

На этом этапе компилятор возьмет предварительно обработанный файл и сгенерирует IR-код (промежуточное представление). Язык абстрактной машины, предназначенный для помощи в анализе компьютерной программы. Это можно сделать с помощью опции «-S» с командой gcc, как показано ниже:

А это содержимое файла «main.s»:

ШАГ 3: СБОРКА

Теперь на этом этапе он возьмет «main.s» и изменит его на объектный код (машинный язык). Этот файл будет заканчиваться расширением «.o». Использование опции -c с командой gcc, как показано ниже:

Содержимое объектного файла будет выглядеть следующим образом:

ШАГ 4: СВЯЗЫВАНИЕ

Это последний шаг, на котором объектный файл будет объединен с библиотеками, что даст нам исполняемый файл, необходимый для запуска нашей программы. Здесь произойдут две вещи:

  • Он свяжет все исходные файлы вместе (объектные файлы) и даже может объединить одну программу с другой. Для простоты возьмем, например, «secondary.o» и объединим его с «main.o», чтобы создать одну программу.
  • Другое дело, что перед всем этим компоновщик будет получать только ссылку на функцию. Но компоновщик разрешит эти ссылки и свяжет объектный файл с библиотеками.

Это можно сделать с помощью команды «gcc» без каких-либо опций, как показано ниже:

Проблема в том, что для тех, кто любит давать своим файлам собственное имя, по умолчанию создается «a.out». запускаемый файл. Если мы хотим изменить это, мы можем использовать эту опцию «-o» после нашего исходного кода, как показано ниже:

Теперь, чтобы протестировать нашу программу, нам просто нужно протестировать ее, используя «./» и имя после этой косой черты, как на изображении ниже:

И результат будет зависеть от вашей программы. Итак, все это и многое другое происходит за кулисами. В Интернете есть гораздо больше информации для поиска, поэтому, как мы говорим: «Погуглите, а затем погуглите еще раз». Удачного программирования!