Как компилируется код? Многие из нас наверняка слышали термин «компилировать» при переводе исходного кода в машинный код, но, возможно, вам он не совсем понятен. Надеюсь, этот пост прольет свет на эту тайну.

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

Чтобы скомпилировать код через терминал, подобный Linux/Unix, вы используете команду gcc и имя файла, и он даст вам исполняемый файл с именем по умолчанию «a.out». Этот довольно мгновенный процесс на самом деле сложнее, чем кажется.

Когда вы компилируете код для языка C, он проходит четыре этапа при обработке компилятором GCC.

Этап предварительной обработки:

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

На этом этапе удаляются все комментарии и все имена макросов заменяются кодом.

Потенциальные ошибки на этом шаге включают неправильно сформированные макросы, такие как функция, ожидающая более одного параметра, когда у вас есть только один или ни одного параметра.

Фаза компиляции:

На этом этапе проверяется синтаксис, а функции проверяются на соответствие прототипам.
Проверка синтаксической правильности — это такие вещи, как подтверждение того, что все строки оператора имеют точку с запятой после них, наличие всех ваших скобок, круглых скобок и фигурных скобок. правильно открывать и закрывать и т.п.
Следует отметить две важные вещи: прототип, по которому проверяется функция, может не существовать, и если вы ошибетесь в написании функции, компилятор подумает, что вы правы. Предполагается, что эта функция существует где-то в текущей библиотеке. На самом деле он не выдаст вам сообщение об ошибке на этом этапе, пока не достигнет этапа компоновки, где он сверится с имеющейся у него библиотекой.
Ошибки на этом этапе связаны с синтаксисом и переменными. Ошибки, связанные с переменными, такие как: «Правильно ли они определены?», «Заставлены ли они принимать правильный тип данных?» и другие.

Фаза сборки:

На этом этапе временные файлы преобразуются в файлы .o или .obj в зависимости от используемой операционной системы. Файлы .o будут наблюдаться в операционных системах Linux, Unix и iOS. Файлы .obj наблюдаются в операционной системе Microsoft. Файлы .o/.obj — это то, что машины понимают как нашу версию исходного кода.

Линкерная фаза:

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