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

Термін «область» також використовується для позначення набору всіх зв'язків імен, дійсних у частині програми або в певній точці програми, що правильніше називати контекстом або середовищем.

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

Для більшості мов програмування, «частина програми» відноситься до частини вихідного коду (області тексту) і відома як лексична область видимості. Проте в деяких мовах «частина програми» відноситься до частини часу виконання (проміжку часу під час виконання) і відома як динамічна область. Обидва ці терміни є певною мірою оманливими — вони неправильно використовують технічні терміни, як обговорювалося у визначенні, — але саме розрізнення є точним, і це стандартні відповідні терміни. Лексичний обсяг є основним предметом цієї статті, при цьому динамічний обсяг розуміється на відміну від лексичного обсягу.

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

Визначення Суворе визначення (лексичного) «області» імені (ідентифікатора) є однозначним: лексичний обсяг — це «частина вихідного коду, в якій застосовується зв'язування імені з сутністю». Це практично не змінилося в порівнянні з визначенням 1960 року в специфікації ALGOL 60. Типові специфікації мови:

ALGOL 60 (1960) "Report on the Algorithmic Language Algol 60", 2.7. Quantities, kinds and scopes Розрізняють такі види величин: прості змінні, масиви, мітки, перемикачі та процедури. Область дії величини — це набір операторів і виразів, у яких дійсне оголошення ідентифікатора, пов'язаного з цією величиною. C (2007) WG14 N1256 (2007 updated version of the C99 standard), 6.2.1 Scopes of identifiers, 2007-09-07 Ідентифікатор може позначати об'єкт; функція; тег або член структури, об'єднання або переліку; ім'я типу; назва етикетки; ім'я макроса; або параметр макроса. Один і той же ідентифікатор може позначати різні сутності в різних точках програми. [. . . ] Для кожної окремої сутності, яку позначає ідентифікатор, ідентифікатор видимий (тобто може бути використаний) лише в області тексту програми, яка називається її областю. Go (2013) The Go Programming Language Specification: Declarations and scope, Version of Nov 13, 2013 Оголошення прив'язує непустий ідентифікатор до константи, типу, змінної, функції, мітки або пакета. [. . . ] Область дії оголошеного ідентифікатора — це обсяг вихідного тексту, у якому ідентифікатор позначає вказану константу, тип, змінну, функцію, мітку або пакет.

Найчастіше «область» означає, коли дане ім'я може посилатися на задану змінну — коли оголошення має ефект — але також може застосовуватися до інших сутностей, таких як функції, типи, класи, мітки, константи та переліки.

Лексичний обсяг проти динамічного

Фундаментальна відмінність у сфері застосування полягає в тому, що означає «частина програми». У мовах із лексичною областю видимості (також званою статичною областю видимості) дозвіл імен залежить від розташування у вихідному коді та лексичного контексту (також називається статичним контекстом), який визначається місцем визначення названої змінної або функції. У мовах із динамічною областю розпізнавання імен залежить від стану програми, коли зустрічається ім'я, що визначається контекстом виконання (також званим контекстом виклику або динамічним контекстом). На практиці з лексичним обсягом ім'я розпізнається шляхом пошуку в локальному лексичному контексті, а якщо це не вдається, шляхом пошуку в зовнішньому лексичному контексті тощо; тоді як з динамічною областю ім'я розпізнається шляхом пошуку в локальному контексті виконання, а якщо це не вдається, шляхом пошуку в зовнішньому контексті виконання тощо, просуваючись вгору по стеку викликів.Borning A. CSE 341 -- Lexical and Dynamic Scoping. University of Washington.

Більшість сучасних мов використовують лексичну область для змінних і функцій, хоча динамічна область використовується в деяких мовах, зокрема в деяких діалектах Lisp, деяких мовах «сценаріїв» і деяких мовах шаблонів. Perl 5 пропонує як лексичну, так і динамічну область видимості. Навіть у мовах із лексичною областю видимість для замикань може збентежити, оскільки вони залежать від лексичного контексту, де визначено закриття, а не від того, де воно викликається.

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

Споріднені поняття

В об'єктно-орієнтованому програмуванні динамічна розсилка вибирає метод об'єкта під час виконання, хоча те, чи виконується фактичне зв'язування імені під час компіляції чи під час виконання, залежить від мови. Фактична динамічна область видимості поширена в мовах макросів, які безпосередньо не розпізнають імена, а натомість розширюються на місці.

Деякі фреймворки програмування, такі як AngularJS, використовують термін «область», щоб означати щось зовсім інше, ніж зазначене в цій статті. У цих фреймворках область видимості — це лише об'єкт мови програмування, яку вони використовують (JavaScript у випадку AngularJS), який певним чином використовується фреймворком для емуляції динамічної області видимості в мові, яка використовує лексичну область видимості для своїх змінних. Ці області AngularJS можуть самі бути в контексті або не в контексті (використовуючи звичайне значення терміну) у будь-якій частині програми, дотримуючись звичайних правил змінної області видимості мови, як і будь-якого іншого об'єкта, і використовуючи власне успадкування та правила включення. У контексті AngularJS іноді використовується термін «$scope» (зі знаком долара), щоб уникнути плутанини, але використання знака долара в іменах змінних часто не рекомендовано посібниками зі стилю.

Різновиди змінних залежно від меж дії У мовах, що підтримують структурне програмування, змінні зазвичай поділяються на два типи залежно від видимості: локальні змінні — оголошуються всередині функції і недоступні поза нею; глобальні змінні — оголошуються поза всіма функціями і доступні звідусіль.

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

Використання

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

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

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

Для таких сутностей, як змінні, область дії — це підмножина часу життя об'єкта (також відома як extent) — ім'я може посилатися лише на змінну, яка існує (можливо, з невизначеним значенням), але існуючі змінні не обов'язково є видимими: змінна може існувати, але бути недоступним (значення зберігається, але не посилається в даному контексті) або доступним, але не через задане ім'я, у цьому випадку воно не в контексті (програма «поза межами імені»). В інших випадках «тривалість життя» не має значення — мітка (іменована позиція у вихідному коді) має тривалість життя, ідентичну програмі (для статично скомпільованих мов), але може бути в контексті чи ні в певній точці програми, а також для статичні змінні — статична глобальна змінна знаходиться в контексті для всієї програми, тоді як статична локальна змінна знаходиться лише в контексті всередині функції або іншого локального контексту, але обидва мають час життя протягом усього виконання програми.

Визначення того, на яку сутність посилається ім'я, відоме як розділення імен або зв'язування імен (зокрема в об'єктно-орієнтованому програмуванні) і залежить від мови. Отримавши назву, мова (власне, компілятор або інтерпретатор) перевіряє всі сутності, які знаходяться в контексті, на відповідність; у разі неоднозначності (дві сутності з однаковою назвою, наприклад глобальна та локальна змінна з однаковою назвою), для їх розрізнення використовуються правила розпізнавання імен. Найчастіше розпізнавання імен спирається на правило «внутрішнього контексту до зовнішнього», наприклад, правило Python LEGB (локальне, охоплююче, глобальне, вбудоване): імена неявно розв'язуються у найвужчому релевантному контексті. У деяких випадках розпізнавання імен може бути явно визначено, наприклад, за допомогою global і nonlocal ключових слів у Python; в інших випадках правила за замовчуванням не можна змінити.