Урок 9: От исходного кода к исполняемому файлу
На прошлом уроке мы увидели, что высокоуровневый код в конечном счёте должен превратиться в машинный код. Но кто выполняет этот перевод, и как несколько написанных нами файлов превращаются в одну программу, которую можно запустить? Ответ — это набор инструментов (toolchain): компилятор, который пере
Чтобы написанный вами код заработал, он проходит через несколько станций: сначала программа переводит его в машинный код, затем несколько частей объединяются в один файл, и наконец файл загружается в память и выполняется. Каждая станция — это отдельный инструмент с одной задачей.
- Компилятор
- Программа, которая переводит исходный код, написанный на высокоуровневом языке, в код более низкого уровня, обычно в ассемблер или машинный код.
- Ассемблер
- Программа, которая переводит ассемблерный код в машинный код и создаёт объектный файл.
- Объектный файл
- Результат работы ассемблера для одного исходного файла: машинный код вместе с таблицей символов, ещё до компоновки.
- Компоновщик
- Программа, которая объединяет несколько объектных файлов и библиотек в один исполняемый файл и разрешает межфайловые ссылки.
- Загрузчик
- Часть операционной системы, которая копирует исполняемый файл с диска в память и запускает его как процесс.
- Исполняемый файл
- Готовый к запуску файл, содержащий скомпонованный машинный код, — конечный продукт цепочки сборки.
- Интерпретатор
- Программа, которая выполняет код строка за строкой во время выполнения, вместо того чтобы заранее переводить его в исполняемый файл.
- Байт-код
- Промежуточная форма — не исходный код и не машинный код процессора, — которую выполняет интерпретатор или виртуальная машина.
- Статическая и динамическая компоновка
- Статическая компоновка встраивает библиотеку в исполняемый файл; динамическая компоновка загружает её отдельно во время выполнения и разделяет между программами.
- Символ
- Имя функции или переменной в таблице символов, которое компоновщик использует, чтобы связать вызов с его определением.