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

Лабораторна робота № 5 Визначень об'єму пам'яті для структур

Мета роботи: вивчення основних принципів розподілу пам'яті, ознайомлення з алгоритмами розрахунку об'єму пам'яті, займаної простими і складеними структурами даних, отримання практичних навиків створення простого аналізатора для розрахунку об'єму пам'яті, займаного заданою структурою даних.

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

Довжину ідентифікаторів і строкових констант вважати обмеженою 32 символами. Програма повинна допускати наявність коментарів необмеженої довжини у вхідному файлі. Форму організації коментарів пропонується вибрати самостійно.

Короткі теоретичні відомості Принципи розподілу пам'яті

Розподіл пам'яті — це процес, який ставить у відповідність лексичним одиницям початкової програми адресу, розмір і атрибути області пам'яті, необхідної для цієї лексичної одиниці. Область пам'яті — це блок елементів пам'яті, що виділяється для даних, якимось чином об'єднаних логічно. Логіка таких об'єднань задається семантикою початкової мови

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

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

Кожну область пам'яті можна класифікувати по двох параметрах: залежно від її ролі в результуючій програмі і залежно від способу її розподілу в ході виконання результуючої програми.По ролі області пам'яті в результуючій програмі вона буває глобальна або локальна. По способах розподілу область пам'яті буває статична або динамічна. Динамічна

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

Мал. 7. Область пам'яті залежно від її ролі і способу розподілу

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

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