мета-данные страницы
Различия
Показаны различия между двумя версиями страницы.
| Предыдущая версия справа и слеваПредыдущая версияСледующая версия | Предыдущая версия | ||
| glossary:prog:compilation [2025/07/13 12:19] – удалено - внешнее изменение (Дата неизвестна) A User Not Logged in | glossary:prog:compilation [2025/11/09 12:07] (текущий) – внешнее изменение A User Not Logged in | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| + | ====== компиляция ====== | ||
| + | |||
| + | (https:// | ||
| + | |||
| + | Программа, | ||
| + | |||
| + | // | ||
| + | |||
| + | Схематично представленный процесс (здесь опущен процесс ассемблирования): | ||
| + | {{: | ||
| + | |||
| + | Результат работы компилятора - перемещаемый объектный файл, а результатом работы компоновщика - файл, готовый к исполнению. | ||
| + | |||
| + | Компоновщик выполняет двойную роль: | ||
| + | - Физически объединяет указанные в списке связей файлы в 1 файл. | ||
| + | - Решает проблему внешних ссылок и обращений к памяти. Внешняя ссылка делается каждый раз, когда в коде файла упоминается код из другого файла. Это случается либо при вызове функции, | ||
| + | |||
| + | ===== Этапы компиляции ===== | ||
| + | |||
| + | ==== Препроцессинг ==== | ||
| + | |||
| + | **Препроцессор** - это // | ||
| + | |||
| + | Хэдеры, | ||
| + | |||
| + | файлы программы проходят препроцессинг независимо друг от друга. | ||
| + | |||
| + | ==== Компиляция / Ассемблирование ==== | ||
| + | |||
| + | Сначала файлы, прошедшие препроцессинг проходят через лексический анализатор, | ||
| + | |||
| + | На данном шаге компилятор выполняет свою главную задачу - компилирует, | ||
| + | |||
| + | Так как x86 процессоры исполняют команды на бинарном коде, необходимо перевести ассемблерный код в машинный с помощью **ассемблера**. Ассемблер преобразовывает ассемблерный код в машинный код, сохраняя его в **объектном файле**. | ||
| + | |||
| + | **Объектный файл** - это созданный ассемблером промежуточный файл, хранящий кусок машинного кода. Этот кусок машинного кода, который еще не был связан вместе с другими кусками машинного кода в конечную выполняемую программу, | ||
| + | |||
| + | Далее возможно сохранение данного объектного кода в **статические библиотеки** для того, чтобы не компилировать данный код снова. | ||
| + | |||
| + | ==== Компоновка / Линковка ==== | ||
| + | |||
| + | Объектных файлов может быть много и нужно их всех соединить в единый исполняемый файл с помощью компоновщика (линкера). Он связывает все объектные файлы и статические библиотеки в единый исполняемый файл, который мы и сможем запустить в дальнейшем. Для того, чтобы понять как происходит связка, | ||