Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Шпори СПОС.docx
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
145.46 Кб
Скачать
  1. Компіляція та компоновка. Основні прийоми розробки початкових текстів, компіляції і компоновки програм. Статична компоновка. Динамічне зв’язування.

Компіляція — це процес перетворення початкової програми у виконувану. Процес компіляції складається з двох етапів. На першому етапі виконується перевірка тексту програми на відсутність помилок, на другому — генерується виконувана програма (ехе-файл).

Компоновка - приймає на вхід один або кілька об'єктних модулів і збирає у виконуваний модуль.

Для зв'язування модулів компонувальник використовує таблиці імен ідентифікаторів, створені компілятором в кожному з об'єктних модулів. Такі імена можуть бути двох типів:

  • Певні або експортовані назви функцій та змінних, визначені в даному модулі і надані для використання іншим модулям.

  • Невизначені або імпортовані імена - функції та змінні, на які посилається модуль, але не визначає їх в середині себе

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

Наявність віртуальних методів у класі (а отже, динамічного зв’язування) обумовлює необхідність ініціалізації всіх об’єктів цього класу. Така ініціалізація здійснюється спеціальними методами, які називають конструкторами. Конструктор повинен викликатись раніше, ніж будь які інші дії над об’єктом класу. Клас може мати декілька конструкторів, наприклад, клас File може мати конструктор Create для створення нового файлу та конструктор Open для відкриття існуючого.

Однак у динамічного зв'язування є недоліки, наприклад, додаткові накладні витрати (тимчасові витрати) на експорт та імпорт інтерфейсів. Величина цих витрат може бути значною, тому що багато клієнтські процеси існують короткий час, а при кожному старті процесу процедура імпорту інтерфейсу повинна бути знову виконана. Крім того, у великих розподілених системах може бути вузьким місцем програма binder, а створення декількох програм аналогічного призначення також збільшує накладні витрати на створення і синхронізацію процесів.

Статичне компонування дозволяє покращити переносимість програм, а динамічне дозволяє зменшити розмір програм.

  1. Створення та підключення бібліотек. Види бібліотек. Управління вибором способу підключення бібліотек, наявних у двох варіантах.

З точки зору комп'ютерних наук бібліотеки діляться на статичні та динамічні.

Статичні бібліотеки можуть бути у вигляді початкового тексту, що підключається програмістом до своєї програми на етапі написання (наприклад, для мови Fortran існує величезна кількість бібліотек для вирішення різних завдань саме в початкових текстах), або у вигляді об'єктних файлів, що приєднуються (лінкуються) до виконуваної програми на етапі компіляції (у Microsoft Windows такі файли мають розширення .lib, у UNIX-подібніх ОС — зазвичай .a). В результаті програма включає всі необхідні функції, що робить її автономною, але збільшує розмір.

Динамічні бібліотеки Також називаються розподілюваними бібліотеками (англ. shared library), або бібліотеками, що динамічно підключаються (англ. Dynamic Link Library, DLL). Це окремі файли, що надають програмі набір використовуваних функцій для завантажування на етапі виконання при зверненні програми до ОС із заявкою на виконання функції з бібліотеки. Якщо необхідна бібліотека вже завантажена в оперативну пам'ять, програма використуватиме завантажену копію бібліотеки. Такий підхід дозволяє зекономити час і пам'ять, оскільки декілька програм використовують одну копію бібліотеки, вже завантажену в пам'ять.

Динамічні бібліотеки зберігаються зазвичай у визначеному місці й мають стандартне розширення. Наприклад, файли .library у логічному томі Libs: у AmigaOS; у Microsoft Windows і OS/2 файли бібліотек загального користування мають розширення .dll; у UNIX-подібних ОС — зазвичай .so; у MacOS — .dylib.

З зошита»»»»»

Утиліта для управління статичними бібліотеками – ar.

Заходимо в каталог ~/SPOS/clib/exemple.1

1-й стан – відкомпілювати створений об’єктний файл

gcc –c test1.c test2.c

2) об’єднаємо наші об’єктні файли arc r libtest.a test1.o test2.o library.a(назва бібліотеки)

3) з файлу app.c також робимо об’єктний файл

gcc –c app.c => app.o

Статичну бібліотеку можна підключити до програми, напр. за допомогою опції ltest компілятора gcc

4) скомпонувати бібліотеку: виконуваний файл

gcc –o app app.o –L. –ltest

–L. – вказує, як бібліотеку потрібно шукати в поточному каталозі.

Результат – утворення виконуваного файлу ./app

Для того щоб створити дин.звязану бібл.. треба спеціальним чином скомпонувати її складові об’єктні файли

gcc –c –fPIC test1.c test2.c

–fPIC - для компіляції об’єктних файлів

2) gcc –c app.c => app.o - робимо обєктний файл з application.c

3) gcc –shared –fPIC –o libtest.so test1.o test2.o компоновка

–shared – опція викор для створення дин.звяз.бібл.

4) gcc –o app app.o –L. –ltest – не запуститься, бо не знає де знайти бібліотеку. Тому ми надаємо змінній оточення певне значення, а саме наш поточний каталог(.)

export LD_LIBRARY_PATH=.

echo $ LD_LIBRARY_PATH