Найти в Дзене

Этапы компиляции

И хотя разработка стремительно уходит в мобильные приложения и веб (я и сам этим стал грешить последнее время), да и приложения для настольных компьютеров тоже уже не всегда собираются “классическими” компиляторами, я всё же решил рассказать об этапах компиляции программы из исходных текстов, потому что начинающим, думаю, это всё равно будет полезно (ну или хотя бы любопытно). Сделаю это на примере компилятора FreePascal, который используется также средой разработки Lazarus. Компиляция программы — это как конвейер по превращению твоего кода (который ты пишешь на Pascal) в понятные процессору "0 и 1". Представь завод: на входе чертежи (исходный код), на выходе — готовая деталь (exe-файл). FreePascal (последние версии, например, 3.2.x и новее) делает это в несколько четких этапов. Я расскажу о них простым и живым языком (ну постараюсь, во всяком случае).. Представь, что компилятор — это очень въедливый учитель, который проверяет твое сочинение. Сначала он берет твой файл .pas или .pp и ч
Оглавление

И хотя разработка стремительно уходит в мобильные приложения и веб (я и сам этим стал грешить последнее время), да и приложения для настольных компьютеров тоже уже не всегда собираются “классическими” компиляторами, я всё же решил рассказать об этапах компиляции программы из исходных текстов, потому что начинающим, думаю, это всё равно будет полезно (ну или хотя бы любопытно). Сделаю это на примере компилятора FreePascal, который используется также средой разработки Lazarus.

Компиляция программы — это как конвейер по превращению твоего кода (который ты пишешь на Pascal) в понятные процессору "0 и 1". Представь завод: на входе чертежи (исходный код), на выходе — готовая деталь (exe-файл).

FreePascal (последние версии, например, 3.2.x и новее) делает это в несколько четких этапов. Я расскажу о них простым и живым языком (ну постараюсь, во всяком случае)..

🏗️ Этап 1. Препарирование кода (Синтаксический анализ)

Представь, что компилятор — это очень въедливый учитель, который проверяет твое сочинение.

Сначала он берет твой файл .pas или .pp и читает его от начала до конца. Он проверяет, не забыл ли ты точку с запятой, правильно ли закрыл скобки и все ли слова (типа begin, if, for) написаны верно. Это называется лексический и синтаксический анализ.

Если на этом этапе компилятор находит ошибку, он тут же останавливается и выдает тебе "выговор" с указанием строки, где что-то пошло не так . Если всё чисто, он строит внутреннюю схему твоей программы, понимая, где у тебя циклы, а где условия.

🗺️ Этап 2. Сборка пазла (Семантический анализ и поиск модулей)

Твоя программа редко бывает сама по себе. Обычно ты подключаешь стандартные модули вроде crt или sysutils.

На этом этапе компилятор смотрит на строчку uses ... и начинает искать эти модули на диске. Это как если бы ты собирал пазл и пошел искать недостающие кусочки по коробкам.

FreePascal ищет уже откомпилированные версии этих модулей — файлы с расширением .ppu (Pascal Unit). В них хранится "скелет" модуля: какие там есть функции, процедуры и переменные. Компилятор сверяет, правильно ли ты вызываешь функции из этих модулей (те ли типы данных передаешь, туда ли возвращаешь результат).

⚙️ Этап 3. Рождение чертежа (Генерация кода)

Вот тут начинается самое интересное. Компилятор переводит твой Pascal на язык, который почти понимает процессор — на ассемблер.

Можно сказать, что он рисует очень подробный чертеж твоей программы. На этом этапе включаются хитрые механизмы оптимизации. Например, если ты написал x := x * 2;, компилятор может заменить это на более быструю команду сдвига битов. Он старается сделать так, чтобы готовая программа работала максимально быстро и занимала меньше места.

В итоге получается промежуточный файл — обычно это файл с расширением .s (ассемблерный листинг) или сразу объектный код в памяти.

🔨 Этап 4. Сборка детали (Ассемблирование)

Теперь ассемблерный код (эти длинные списки странных команд) нужно превратить в настоящий машинный код — в те самые "0 и 1", которые понимает твой процессор.

Это делает специальная программа-ассемблер, встроенная в компилятор. Она берет "чертеж" с прошлого этапа и создает объектный файл (обычно .o или .obj). Это как если бы по чертежам напечатали отдельные пластиковые детальки для конструктора.

На этом этапе твоя программа — это еще не готовый продукт, а просто набор таких "деталек". У тебя есть ваша программа (имя.o) и есть детальки от стандартных модулей (crt.o, sysutils.o), которые система взяла из библиотек.

🧩 Этап 5. Склейка всего воедино (Компоновка / Линковка)

Последний этап — самая ответственная сборка. Программа-линкер (компоновщик) получает на вход все объектные файлы (и твой, и системные) и начинает их "склеивать".

Компоновщику нужно:

  1. Соединить твой код с кодом из модулей (например, чтобы вызов writeln действительно отправил текст на экран).
  2. Добавить в программу специальный код, который запускается самым первым и подготавливает память (так называемый код инициализации).
  3. Прописать адреса, чтобы функция из одного модуля знала, где находится функция из другого.

Результат этой глобальной склейки — твой готовый исполняемый файл (hello.exe или просто hello), который можно запустить .

🎬 Бонус: Что нового в последних версиях?

В современных версиях FreePascal (3.2.x) этот конвейер стал ещё круче:

  • Умная оптимизация: Компилятор научился лучше выкидывать "мертвый" код, который никогда не выполняется, и эффективнее работать с циклами.
  • Поддержка новых процессоров: Если у тебя современный 64-битный процессор или даже ARM (как в Raspberry Pi или некоторых ноутбуках), компилятор сгенерирует код специально для него .
  • Встроенный линкер: Для многих платформ (Windows, Linux) линковка теперь происходит "внутри" компилятора быстрее и без вызова сторонних программ .

Вот так твоя строчка program Hello; проходит долгий путь от текстового файла до работающей программы. Надеюсь, теперь этот процесс стал чуточку понятнее и интереснее!

На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.