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

Види областей пам'яті. Статичне і динамічне скріплення . Глобальна і локальна пам'ять .

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

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

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

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

...

const

Global_1 = 1;

Global_2 : integer = 2;

var

Global_I : integer;

...

function Test (Param: integer): pointer;

const

Local_1 = 1;

Local_2 : integer = 2;

var

Local_I : integer;

begin

...

end;

Згідно семантиці мови Pascal, змінна Global_I є глобальною змінною мови і розміщується в глобальній області пам'яті, константа Global_1 також є глобальною, але мова не вимагає, щоб компілятор обов'язково розміщував її в пам'яті — значення константи може бути безпосередньо підставлене в код результуючої програми там, де вона використовується. Константа Global_2, що типізується, є глобальною, але на відміну від константи Global_1, семантика мови припускає, що ця константа обов'язково буде розміщена в пам'яті, а не в коді програми. Доступність ідентифікаторів Global_I, Global_2 і Global_1 з інших модулів залежить від того, де і як вони описані. Наприклад, для компілятора Borland Pascal змінні і константи, описані в заголовку модулів, доступні з інших модулів програми, а змінні і константи, описані в тілі модулів, недоступні, хоча і ті та інші є глобальними.

Параметр Param функції Test, змінна Local_I і константа Local_1 є локальними елементами цієї функції. Вони не доступні поза межами даної функції і розташовуються в локальній області пам'яті. Константа Local_2, що типізується, є дуже цікавим елементом програми. З одного боку, вона не доступна поза межами функції Test і тому є її локальним елементом. З іншого боку, як константа, що типізується, вона розташовуватиметься в глобальній області пам'яті, хоча нізвідки ззовні не може бути доступна (аналогічними конструкціями мови C, наприклад, є локальні змінні функцій, описані як static).

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