Первоначальный компилятор 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
- Предварительная обработка
- Компилятор
- Ассемблер
- Ссылка
Препроцессор обрабатывает операторы или строки кода, начинающиеся с символа "#", которые называются "директивами препроцессора". Препроцессор читает и обрабатывает каждый файл исходного кода по одному сверху вниз. Он не изменяет содержимое ни одного из обрабатываемых файлов, а создает временный файл, содержащий обработанный исходный код.
Компилятор
Компилятор — это программа, которая преобразует ряд операторов программы в двоичный язык, но она более интеллектуальна, чем интерпретатор, потому что она просматривает весь код сразу и может указать возможные ошибки, ограничения и диапазоны. Но это делает это время работы немного медленнее. это зависит от платформы. это помогает обнаруживать ошибки и отображаться после чтения всего кода компилятором.
Другими словами, мы можем сказать, что "компиляторы превращают язык высокого уровня в двоичный язык или машинный код только один раз", это известно как компилятор.
На самом деле компилятор состоит из трех отдельных программ:
- Препроцессор
- Переводчик кода, который также часто называют компилятором
- Компоновщик (также называемый загрузчиком в некоторых операционных системах)
Ассемблер
Ассемблер — это программа, преобразующая язык ассемблера в машинный код. На ассемблере программист может написать программу в виде последовательности ассемблерных инструкций, последовательность ассемблерных инструкций называется исходным кодом и исходной программой.
Линкер
Для запуска кода нам нужно включить заголовочный файл или файл, сохраненный из библиотеки, которые предопределены, если они не включены в начало программы, то после выполнения компилятор выдаст ошибки, а код не будет работать.
Компоновщик — это программа, которая содержит один или несколько объектных файлов, созданных компилятором, и объединяет их в один исполняемый файл. Связывание осуществляется как во время загрузки, так и во время компиляции. Время компиляции — это когда язык высокого уровня превращается в машинный код, а время загрузки — когда код загружается в память загрузчиком.
Линкер бывает двух типов:
Динамический компоновщик:
- Это реализуется во время выполнения.
- Требуется меньше памяти.
- При динамическом связывании существует много шансов на ошибку и вероятность сбоя.
- Связывание сохраненной программы в виртуальной памяти для экономии оперативной памяти, поэтому нам нужна общая библиотека
Статический компоновщик:
- Реализуется при компиляции исходной программы.
- Требуется больше памяти.
- Связывание реализуется перед выполнением при статической компоновке.
- Он быстрее и портативнее.
- При статической привязке меньше шансов на ошибку и нет шансов на ошибку.
Загрузчик
Загрузчик — это программа, которая загружает машинные коды программы в системную память. Это часть операционной системы компьютера, отвечающая за загрузку программы. Это голое начало выполнения программы. Загрузка программы включает чтение содержимого исполняемого файла в память. Только после загрузки программы операционная система запускает программу, передавая управление загруженному программному коду. Все ОС, поддерживающие загрузку, имеют загрузчик, а у многих загрузчики постоянно находятся в памяти.
Чтобы понять немного больше, ознакомьтесь с этим источником:
Глэдис Надер