6. Зв’язування.
Часом зв'язуванняназивається відповідно фаза підготовки програми до виконання (трансляція, компонування, завантаження), на якій проводиться ця дія. Зауважимо, що різні характеристики однієї й тієї ж об'єкта (наприклад, змінної) можуть пов'язуватися з різними елементами архітектури у час, тобто процес зв'язування перестав бути одномоментним. Для початку перерахуємо можливі часи зв'язування:
щодо мови;
під час реалізації компілятора;
під час трансляції;
при компонуванні (зв'язуванні);
під час завантаження програми;
під час виконання програми, у тому числі:
при вході у модуль (процедуру, функцію);
у довільній точці виконання програми.
Як приклад розглянемо найпростіший фрагмент програми, котрим перерахуємо більш-менш повний перелік часів зв'язування його різних властивостей з елементами архітектури комп'ютера:
1. Тип зміннихint- як спосіб визначення цілої змінної в машинному слові стандартної довжини (подання цілого зі знаком, додатковий код), пов'язується з аналогічною формою представлення даних у комп'ютері щодо мови. Мова Сі характерний тим, що базові типи даних у ньому повністю збігаються з відповідними формами представлення даних у комп'ютері.
2. Конкретна розмірність змінної 2 визначається при реалізації відповідного компілятора.
3. Ім'яaможе бути визначене у конструкції виду#define a 0x11FF. У цьому випадку ім'я (псевдо-змінна) пов'язується зі своїм значенням на першій фазі трансляції – у препроцесорі.
4. Якщо змінна визначається звичайним способом у виглядіint a;то зв'язування змінної з відповідним їй типомвідбувається під час трансляції (на фазі семантичного аналізу).
5. Якщо змінна визначається як зовнішня (глобальна, поза тілом функції), то сенс її трансляції полягає у розподілі під неї пам'яті в сегменті даних програми, що створюється для поточного модуля (файлу). Але при цьому сама розподілена пам'ять до конкретної оперативної пам'яті здійснюється в кілька етапів:
6. Якщо змінна визначається як автоматична (локальна всередині тіла функції чи блоку), вона розміщується у стеку програми:
7. Тип операції “+” у конкретному вираженніa+bвизначається під час трансляції залежно від типів операндів. У разі генерується операція цілого складання.
8. З погляду часу зв'язування поняттяініціалізаціязовнішніх змінних можна з'ясувати, як зв'язування змінних зі своїми значеннями у процесі трансляції програми (int a=10;) З цього погляду звичайне присвоєння можна розглядати як зв'язування змінної з її значенням під час виконання програми.
З поняттям зв'язування близько сусідять термінистатичнийідинамічний.Статичним називається елемент мови, що повністю визначається при трансляції (і компонуванні). Відповідно, динамічний елемент чи його властивості визначаються під час роботи програми. Аналогічним чином розуміються термінистатичне та динамічне зв'язування.
На закінчення відзначимо основні властивості Сі з погляду понять «зв'язування, статичний, динамічний»:
мова Сі є компілюваною мовою з великою часткою статичного зв'язування. Навіть там, де можна легко реалізувати введення динамічних компонентів (наприклад, створення локальних масивів змінної розмірності), це виключається задля підтримки одноманітності;
Майже всі випадки динамічного зв'язування реалізуються явно і вимагають програмної (технологічної) підтримки програмістом.
Саме тому приклади динамічного зв'язування можна «перерахувати на пальцях»:
динамічні змінні та масиви (5.6);
динамічне зв'язування функцій за допомогою покажчиків на функції