Нагадаємо, що кожен модуль (процедура, функція, програма) складається з заголовка (procedure ..., function ..., program ...) і блоку.
Якщо блок будь-якої процедури p1 містить всередині процедуру p2. то кажуть, що p2 вкладена в p1.
Будь-які ідентифікатори, введені усередині якого-небудь блоку (процедури, функції) для опису змінних, констант, типів, процедур, називаються локальними для даного блоку. Такий блок разом з вкладеними в нього модулями називають областю дії цих локальних змінних, констант, типів і процедур.
Константи, змінні, типи, описані в блоці program, називаються глобальними. Здавалося б, простіше мати справу взагалі тільки з глобальними змінними, описавши їх все в program. Але використання локальних змінних дозволяє системі краще оптимізувати програми, робити їх більш наочними і зменшує ймовірність появи помилок.
При написанні програм, що мають вкладені модулі, необхідно дотримуватися наступних правил:
- Описувати ідентифікатори в тому блоці, де вони використовуються, якщо це можливо.
- Якщо один і той же об'єкт (змінна, тип, константа) використовуються в двох і більш блоках, то описати цей об'єкт треба в самому зовнішньому із них, що містить всі інші блоки, що використовують даний об'єкт.
- Якщо змінна, яка використовується в процедурі, повинна зберегти своє значення до наступного виклику цієї процедури, то таку змінну треба описати в зовнішньому блоці, що містить дану процедуру.
Локалізація змінних дає програмісту велику свободу у виборі ідентифікаторів. Так, якщо дві процедури a і b повністю відокремлені один від одного (тобто не вкладені одна в іншу), то ідентифікатори в них можуть бути обрані абсолютно довільно, зокрема, можуть повторюватися. В цьому випадку збігається ідентифікаторів відповідають різні області пам'яті, зовсім один з одним не пов'язані.
Якщо один і той же ідентифікатор описаний в блоці b і вдруге описаний у вкладеному в b блоці c. то треба пам'ятати, що ці два однакових ідентифікатора відповідають різним осередків пам'яті.
Глобальних змінних i і a відводяться два відділення пам'яті. Першими виконуються оператори a: = 2.0 і i: = 15. Потім викликається процедура p (a). В процесі роботи p відводиться осередок для локальної змінної i і туди засилається число 3. Після закінчення роботи процедури p цей осередок i програмою «забувається». Після повернення на оператор writeln програма знає тільки одну клітинку i - глобальну, тобто ту, яка містить число 15. Тому програма видасть на друк i = 15, a = 23.0, тому що a = 3 + 10 * 2.
Якщо локальна і глобальна змінна належать до одного і того ж складного типу, то цей тип треба описати в розділі type. а самі змінні описувати через цей загальний тип.
У цьому прикладі змінні a і b описані через загальний тип ab. Якщо ж локальна і глобальна змінні описані однаково, але не через загальний тип, то програма може «не понять», що ці змінні належать одному типу.
У цьому прикладі змінні a і b - однакові масиви, тобто типи цих змінних однакові, але програма, проте, «не вважає», що a і b належать одному типу. Це відбувається через те, що опис масивів дано в різних блоках.