Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторна робота5.doc
Скачиваний:
2
Добавлен:
09.11.2019
Размер:
138 Кб
Скачать
☆

Статична і динамічна пам'ять .

Статична область пам'яті — це область пам'яті, розмір якої відомий на етапі компіляції.

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

Динамічна область пам'яті — це область пам'яті, розмір якої на етапі компіляції програми не відомий.

Розмір динамічної області пам'яті буде відомий тільки в процесі виконання результуючої програми. Тому для динамічної області пам'яті компілятор не може безпосередньо виділити адресу — для неї він породжує фрагмент коду, яка відповідає за розподіл пам'яті (її виділення і звільнення). Як правило, з динамічними областями пам'яті пов'язано багато операцій з вказівниками і з екземплярами об'єктів (класів) в об'єктно-орієнтованих мовах програмування. При використанні динамічних областей пам'яті говорять про динамічне скріплення області пам'яті і лексичної одиниці вхідної мови.

Динамічні області пам'яті, у свою чергу, можна розділити на динамічні області пам'яті, що виділяються користувачем, і динамічні області пам'яті, що виділяються безпосередньо компілятором.

Динамічні області пам'яті, що виділяються користувачем, з'являються в тих випадках, коли розробник початкової програми явно використовує в тексті програми функції, пов'язані з розподілом пам'яті (прикладом таких функцій є New і Dispose в мові Pascal, malloc і free в мові C, new і delete в мові C++ та інші). Функції розподілу пам'яті можуть використовувати або безпосередньо засоби ОС, або засоби початкової мови (які, врешті-решт, все одно засновані на засобах ОС). В цьому випадку за своєчасне виділення і звільнення пам'яті відповідає сам розробник, а не компілятор. Компілятор повинен тільки побудувати код виклику відповідних функцій і збереження результату — в принципі, для нього робота з динамічною пам'яттю користувача нічим не відрізняється від роботи з будь-якими іншими функціями і додаткових складнощів не викликає.

Інша справа — динамічні області пам'яті, що виділяються компілятором. Вони з'являються тоді, коли користувач використовує типи даних, операції над якими припускають перерозподіл пам'яті, не присутній в явному вигляді в тексті початкової програми. Прикладами таких типів даних можуть служити рядки в деяких мовах програмування, динамічні масиви і, звичайно, багато операцій над екземплярами об'єктів (класів) в об'єктно-орієнтованих мовах (найбільш характерний приклад — тип даних string в Borland Delphi). В цьому випадку сам компілятор відповідає за породження коди, яка завжди забезпечуватиме своєчасне виділення пам'яті під елементи програми і за звільнення її у міру використання.

Як статичні, так і динамічні області пам'яті самі по собі можуть бути глобальними або локальними.

Порядок виконання роботи

  1. Отримати варіант завдання у викладача.

  2. Побудувати розпізнавач для вхідної програми на основі заданої граматики.

  3. Вивчити алгоритм розрахунку необхідного об'єму пам'яті для структур даних вхідної програми.

  4. Розробити фрагменти об'єктного коду, що реалізовують на мові асемблера прості операції в заданій граматиці.

  5. Реалізувати алгоритм розрахунку об'єму необхідної пам'яті на основі результатів синтаксичного аналізу..

  6. Виконати розрахунок необхідного об'єму пам'яті для вибраного простого прикладу. Перевірити коректність результату.

  7. Підготувати і захистити звіт.

  8. Написати і настроїти програму на ЕОМ.