Рубрики

Компиляция программы на C: — За кулисами

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

Как мы компилируем и запускаем программу на C?

Ниже приведены шаги, которые мы используем на машине Ubuntu с компилятором gcc.

  • Сначала мы создаем программу на C, используя редактор, и сохраняем файл как filename.c
     $ vi filename.c

    Диаграмма справа показывает простую программу для добавления двух чисел.

  • Затем скомпилируйте его с помощью команды ниже.
     $ gcc –Wall filename.c –o filename

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

  • После компиляции генерируется исполняемый файл, и мы запускаем сгенерированный исполняемый файл с помощью команды ниже.
     $ ./filename 

Что входит в процесс компиляции?

Компилятор преобразует C-программу в исполняемый файл. Существует четыре этапа, на которых программа на Си становится исполняемой:

  1. Предварительная обработка
  2. компиляция
  3. сборочный
  4. соединение

Выполнив следующую команду, мы получим все промежуточные файлы в текущем каталоге вместе с исполняемым файлом.

 $gcc –Wall –save-temps filename.c –o filename 

На следующем снимке экрана показаны все созданные промежуточные файлы.

Давайте посмотрим один за другим, что содержат эти промежуточные файлы.

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

Это первая фаза, через которую передается исходный код. Этот этап включает в себя:

  • Удаление комментариев
  • Расширение макросов
  • Расширение включаемых файлов.
  • Условная компиляция

Предварительно обработанный вывод сохраняется в файле filename.i . Давайте посмотрим, что находится внутри filename.i: используя $ vi filename.i

В приведенном выше выводе исходный файл заполнен большим и большим количеством информации, но в конце наш код сохраняется.
Анализ:

  • printf теперь содержит a + b вместо add (a, b), потому что макросы расширились.
  • Комментарии удаляются.
  • #include <stdio.h> отсутствует, вместо этого мы видим много кода. Таким образом, заголовочные файлы были расширены и включены в наш исходный файл.

составление

Следующим шагом является компиляция filename.i и создание; промежуточный скомпилированный выходной файл filename.s . Этот файл находится в инструкциях уровня сборки. Давайте посмотрим через этот файл, используя $ vi filename.s

Снимок показывает, что он написан на ассемблере и понятен ассемблеру.

сборочный

На этом этапе имя файла.s берется в качестве входных данных и преобразуется в filename.o ассемблером. Этот файл содержит инструкции уровня машины. На этом этапе только существующий код преобразуется в машинный язык, вызовы функций, такие как printf (), не разрешаются. Давайте рассмотрим этот файл, используя $ vi filename.o

соединение

Это последняя фаза, на которой выполняются все связи вызовов функций с их определениями. Линкер знает, где реализованы все эти функции. Линкер также выполняет некоторую дополнительную работу, он добавляет некоторый дополнительный код в нашу программу, который требуется, когда программа запускается и заканчивается. Например, существует код, необходимый для настройки среды, например, передача аргументов командной строки. Эту задачу легко проверить, используя $ size filename.o и $ size filename . Благодаря этим командам мы узнаем, как увеличивается выходной файл из объектного файла в исполняемый файл. Это из-за дополнительного кода, который компоновщик добавляет с нашей программой.

Обратите внимание, что GCC по умолчанию выполняет динамическое связывание, поэтому printf () динамически связывается в приведенной выше программе. См. Это , это и это для более подробной информации о статических и динамических связях.

Эта статья предоставлена Викашем Кумаром . Пожалуйста, пишите комментарии, если вы обнаружите что-то неправильное или вы хотите поделиться дополнительной информацией по обсуждаемой выше теме.

Рекомендуемые посты:

Компиляция программы на C: — За кулисами

0.00 (0%) 0 votes