Первоначальный компилятор GNU C (GCC) разработан Ричардом Столменом, основателем проекта GNU. Ричард Столлман основал проект GNU в 1984 году, чтобы создать полную Unix-подобную операционную систему в качестве свободного программного обеспечения, чтобы способствовать свободе и сотрудничеству между пользователями компьютеров и программистами. GCC — это интегрированный дистрибутив компиляторов для нескольких основных языков программирования. В настоящее время к этим языкам относятся C, C++, Objective-C, Objective-C++, Java, Fortran и Ada.

Для выполнения кода и создания объектного файла компьютер должен взаимодействовать на машинном языке, который представляет собой двоичный код (с основанием 2); в этом случае для компиляции необходимо использовать команду Unix: GCC main.c

Что произойдет, если ввести gcc main.c в терминал?

Этапы построения процесса компиляции кода:

1. Чтение исходного файла
2. Обработка файла
3. Связывание файла с библиотекой времени выполнения.

Четыре этапа компиляции программы на C

  • Предварительная обработка
  • Компилятор
  • Ассемблер
  • Ссылка

Препроцессор обрабатывает операторы или строки кода, начинающиеся с символа "#", которые называются "директивами препроцессора". Препроцессор читает и обрабатывает каждый файл исходного кода по одному сверху вниз. Он не изменяет содержимое ни одного из обрабатываемых файлов, а создает временный файл, содержащий обработанный исходный код.

Компилятор

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

Другими словами, мы можем сказать, что "компиляторы превращают язык высокого уровня в двоичный язык или машинный код только один раз", это известно как компилятор.

На самом деле компилятор состоит из трех отдельных программ:

  1. Препроцессор
  2. Переводчик кода, который также часто называют компилятором
  3. Компоновщик (также называемый загрузчиком в некоторых операционных системах)

Ассемблер

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

Линкер

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

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

Линкер бывает двух типов:

Динамический компоновщик:

  • Это реализуется во время выполнения.
  • Требуется меньше памяти.
  • При динамическом связывании существует много шансов на ошибку и вероятность сбоя.
  • Связывание сохраненной программы в виртуальной памяти для экономии оперативной памяти, поэтому нам нужна общая библиотека

Статический компоновщик:

  • Реализуется при компиляции исходной программы.
  • Требуется больше памяти.
  • Связывание реализуется перед выполнением при статической компоновке.
  • Он быстрее и портативнее.
  • При статической привязке меньше шансов на ошибку и нет шансов на ошибку.

Загрузчик

Загрузчик — это программа, которая загружает машинные коды программы в системную память. Это часть операционной системы компьютера, отвечающая за загрузку программы. Это голое начало выполнения программы. Загрузка программы включает чтение содержимого исполняемого файла в память. Только после загрузки программы операционная система запускает программу, передавая управление загруженному программному коду. Все ОС, поддерживающие загрузку, имеют загрузчик, а у многих загрузчики постоянно находятся в памяти.

Чтобы понять немного больше, ознакомьтесь с этим источником:

Глэдис Надер