- •Лабораторна робота № 5 Визначень об'єму пам'яті для структур
- •Короткі теоретичні відомості Принципи розподілу пам'яті
- •Види змінних і областей пам'яті. Розподіл пам'яті для змінних скалярних типів
- •Розподіл пам'яті для складних структур даних .
- •Вирівнювання меж областей пам'яті
- •Види областей пам'яті. Статичне і динамічне скріплення . Глобальна і локальна пам'ять .
- •Статична і динамічна пам'ять .
- •Варіанти початкових граматик
- •Вимоги до оформлення звіту
- •Основні контрольні питання
- •Варіанти завдань
- •Література, що рекомендується
Статична і динамічна пам'ять .
Статична область пам'яті — це область пам'яті, розмір якої відомий на етапі компіляції.
Оскільки для статичної області пам'яті відомий її розмір, компілятор завжди може виділити цю область пам'яті і пов'язати її з відповідним елементом програми. Тому для статичної області пам'яті компілятор породжує деяка адреса (як правило, це відносна адреса в програмі). Статичні області пам'яті обробляються компілятором найпростішим чином, оскільки безпосередньо пов'язані зі своєю адресою. В цьому випадку говорять про статичне скріплення області пам'яті і лексичної одиниці вхідної мови.
Динамічна область пам'яті — це область пам'яті, розмір якої на етапі компіляції програми не відомий.
Розмір динамічної області пам'яті буде відомий тільки в процесі виконання результуючої програми. Тому для динамічної області пам'яті компілятор не може безпосередньо виділити адресу — для неї він породжує фрагмент коду, яка відповідає за розподіл пам'яті (її виділення і звільнення). Як правило, з динамічними областями пам'яті пов'язано багато операцій з вказівниками і з екземплярами об'єктів (класів) в об'єктно-орієнтованих мовах програмування. При використанні динамічних областей пам'яті говорять про динамічне скріплення області пам'яті і лексичної одиниці вхідної мови.
Динамічні області пам'яті, у свою чергу, можна розділити на динамічні області пам'яті, що виділяються користувачем, і динамічні області пам'яті, що виділяються безпосередньо компілятором.
Динамічні області пам'яті, що виділяються користувачем, з'являються в тих випадках, коли розробник початкової програми явно використовує в тексті програми функції, пов'язані з розподілом пам'яті (прикладом таких функцій є New і Dispose в мові Pascal, malloc і free в мові C, new і delete в мові C++ та інші). Функції розподілу пам'яті можуть використовувати або безпосередньо засоби ОС, або засоби початкової мови (які, врешті-решт, все одно засновані на засобах ОС). В цьому випадку за своєчасне виділення і звільнення пам'яті відповідає сам розробник, а не компілятор. Компілятор повинен тільки побудувати код виклику відповідних функцій і збереження результату — в принципі, для нього робота з динамічною пам'яттю користувача нічим не відрізняється від роботи з будь-якими іншими функціями і додаткових складнощів не викликає.
Інша справа — динамічні області пам'яті, що виділяються компілятором. Вони з'являються тоді, коли користувач використовує типи даних, операції над якими припускають перерозподіл пам'яті, не присутній в явному вигляді в тексті початкової програми. Прикладами таких типів даних можуть служити рядки в деяких мовах програмування, динамічні масиви і, звичайно, багато операцій над екземплярами об'єктів (класів) в об'єктно-орієнтованих мовах (найбільш характерний приклад — тип даних string в Borland Delphi). В цьому випадку сам компілятор відповідає за породження коди, яка завжди забезпечуватиме своєчасне виділення пам'яті під елементи програми і за звільнення її у міру використання.
Як статичні, так і динамічні області пам'яті самі по собі можуть бути глобальними або локальними.
Порядок виконання роботи
Отримати варіант завдання у викладача.
Побудувати розпізнавач для вхідної програми на основі заданої граматики.
Вивчити алгоритм розрахунку необхідного об'єму пам'яті для структур даних вхідної програми.
Розробити фрагменти об'єктного коду, що реалізовують на мові асемблера прості операції в заданій граматиці.
Реалізувати алгоритм розрахунку об'єму необхідної пам'яті на основі результатів синтаксичного аналізу..
Виконати розрахунок необхідного об'єму пам'яті для вибраного простого прикладу. Перевірити коректність результату.
Підготувати і захистити звіт.
Написати і настроїти програму на ЕОМ.
