logo

Процес компіляції в c

Що таке компіляція?

Компіляція - це процес перетворення вихідного коду в об'єктний код. Це робиться за допомогою компілятора. Компілятор перевіряє вихідний код на наявність синтаксичних або структурних помилок і, якщо у вихідному коді немає помилок, генерує об’єктний код.

Процес компіляції в c

Процес компіляції C перетворює вихідний код, прийнятий як вхідний, в об'єктний код або машинний код. Процес компіляції можна розділити на чотири етапи, тобто попередня обробка, компіляція, збірка та зв’язування.

Препроцесор приймає вихідний код як вхідні дані та видаляє всі коментарі з вихідного коду. Препроцесор приймає директиву препроцесора та інтерпретує її. Наприклад, якщо , директива доступна в програмі, тоді препроцесор інтерпретує директиву та замінює цю директиву вмістом 'stdio.h' файл.

Нижче наведено фази, через які проходить наша програма перед перетворенням у виконувану форму:

    Препроцесор Упорядник Монтажник Компонувальник
Процес компіляції в c

Препроцесор

Вихідний код – це код, написаний у текстовому редакторі, і файлу вихідного коду надано розширення '.c'. Цей вихідний код спочатку передається препроцесору, а потім препроцесор розширює цей код. Після розширення коду розширений код передається компілятору.

Упорядник

Код, який розширюється препроцесором, передається компілятору. Компілятор перетворює цей код на код асемблера. Або ми можемо сказати, що компілятор C перетворює попередньо оброблений код у код асемблера.

Монтажник

Код складання перетворюється на об'єктний код за допомогою асемблера. Ім'я об'єктного файлу, створеного асемблером, збігається з ім'ям вихідного файлу. Розширення об’єктного файлу в DOS — «.obj», а в UNIX — «o». Якщо ім'я вихідного файлу 'hello.c', тоді ім’я об’єктного файлу буде «hello.obj».

Компонувальник

В основному всі програми, написані мовою C, використовують бібліотечні функції. Ці бібліотечні функції є попередньо скомпільованими, а об’єктний код цих бібліотечних файлів зберігається з розширенням «.lib» (або «.a»). Основна робота компонувальника полягає в об’єднанні об’єктного коду файлів бібліотеки з об’єктним кодом нашої програми. Іноді виникає ситуація, коли наша програма посилається на функції, визначені в інших файлах; тоді лінкер відіграє в цьому дуже важливу роль. Він пов’язує об’єктний код цих файлів із нашою програмою. Отже, ми робимо висновок, що робота компонувальника полягає в тому, щоб зв’язати об’єктний код нашої програми з об’єктним кодом файлів бібліотеки та інших файлів. Результатом компонування є виконуваний файл. Ім'я виконуваного файлу таке ж, як і вихідного файлу, але відрізняється лише розширеннями. У DOS виконуваний файл має розширення '.exe', а в UNIX виконуваний файл може мати назву 'a.out'. Наприклад, якщо ми використовуємо функцію printf() у програмі, компонувальник додає відповідний код у файл виводу.

Розберемося на прикладі.

привіт.c

 #include int main() { printf('Hello javaTpoint'); return 0; } 

Тепер ми створимо блок-схему наведеної вище програми:

Процес компіляції в c

На наведеній вище блок-схемі для виконання програми виконуються наступні кроки:

  • По-перше, вхідний файл, тобто привіт.c, передається препроцесору, і препроцесор перетворює вихідний код у розширений вихідний код. Розширенням розширеного вихідного коду буде привіт.і.
  • Розширений вихідний код передається компілятору, і компілятор перетворює цей розширений вихідний код на код асемблера. Розширенням коду складання буде привіт.с.
  • Цей код складання потім надсилається до асемблера, який перетворює код складання в об’єктний код.
  • Після створення об’єктного коду компонувальник створює виконуваний файл. Потім завантажувач завантажить виконуваний файл для виконання.