دامنه (علوم رایانه)

گستره یا دامنه (به انگلیسی: Scope) مرتبط با یک انقیاد نام (پیوند بین یک نام و یک موجودیت مانند متغیر) در برنامه‌نویسی، محدوده‌ای از برنامه است که این نام‌گذاری در آن اعتبار دارد. به بیان دیگر در کدام قسمت از برنامه می‌توان از این نام برای اشاره به موجودیت مورد نظر استفاده کرد. به این قسمت محدوده دامنه (به انگلیسی: Scope Block) گفته می‌شود. در قسمت‌های دیگر برنامه ممکن است همین نام به موجودیت دیگری اشاره کند (انقیاد متفاوتی داشته باشد) یا اصلاً به چیزی اشاره نکند.[۱][۲]

دامنهٔ یک انقیاد، به‌ویژه در متون قدیمی‌تر، با عنوان میدان دید یک موجودیت (به انگلیسی: Visibility of an entity) نیز شناخته می‌شود. در این روش نام‌گذاری، اصالت به موجودیت داده شده‌است در حالی که در نام‌گذاری دامنه، دامنه مستقیماً به انقیاد مرتبط می‌شود.

در تعریف دامنه از عبارت «قسمتی از برنامه» استفاده می‌شود که خود می‌تواند مفاهیم متفاوتی داشته باشد. «قسمتی از برنامه» می‌تواند قسمتی از «کد منبع برنامه» باشد که به آن دامنهٔ واژگانی یا دامنه ایستا گفته می‌شود.[۳] در بعضی از زبان‌ها «قسمتی از برنامه» می‌تواند به قسمتی از برنامه در زمان اجرا اشاره کند، که به آن دامنه پویا می‌گویند.[۱]

تعریف ویرایش

تعریف صریح دامنهٔ یک شناسه کاملاً بدون ابهام است. قسمتی از کد منبع است که انقیاد یک نام با موجودیت در آن اتفاق می‌افتد. تعریف دامنه از سال ۱۹۶۰ که در زبان برنامه‌نویسی الگول ۶۰ صورت گرفت، تغییری نکرده‌است.[۴]

الگول ۶۰ (سال ۱۹۶۰) ویرایش

این انواع از کمیت‌ها برجسته‌اند: متغیرهای ساده، آرایه‌ها، لیبل‌ها، سوییچ‌ها و رویه‌ها. دامنه یک کمیت مجموعه‌ای از عبارت‌های برنامه‌نویسی هستند که اعلان پیوند بین یک نام و شناسه در آن معتبر است.

دامنه ایستا و دامنه پویا ویرایش

یک تفاوت عمده در دامنه‌ها معنی عبارت «قسمتی از برنامه» است. در زبان‌های با دامنه واژگانی (به انگلیسی: lexical scope) یا دامنه ایستا (به انگلیسی: static scope)، تحلیل نام‌ها به محلی از کد منبع بستگی دارد که تابع یا متغیر در آنجا تعریف می‌شود. از سوی دیگر، در زبان‌های با دامنه پویا (به انگلیسی: dynamic scope) تحلیل نام‌ها به وضعیت برنامه در زمانی که با نام انقیاد شده مواجه می‌شود، بستگی دارد. زمینه اجرای (به انگلیسی: execution context) برنامه نیز بر این تحلیل تأثیرگذار است. در عمل، در دامنه ایستا، تعریف یک متغیر با جستجو در محدودهٔ آن متغیر یا تابع آغاز می‌شود؛ در صورتی که یافت نشد، جستجو در محدوده‌های بیرونی‌تر (به انگلیسی: outer blocks) ادامه می‌یابد. اما در دامنه پویا، ابتدا در تابع صدا زده شده جستجو می‌شود، در صورت که یافت نشد، به تابعی که تابع فعلی را صدا زده رجوع می‌شود و جستجو به همین منوال در پشته توابع ادامه پیدا می‌کند.[۵] البته در هر دو حالت، جستجو از دامنه محلی (به انگلیسی: local scope) تعریف آغاز می‌شود.

امروزه بیشتر زبان‌های برنامه‌نویسی از دامنه ایستا استفاده می‌کنند با این حال دامنه پویا نیز در برخی از زبان‌ها مورد استفاده قرار می‌گیرد؛ مهم‌ترین این زبان‌ها نسخه‌هایی از لیسپ و زبان‌های اسکریپتی مانند پرل و برخی از زبان‌های قالبی هستند.

تحلیل واژگان در زمان کامپایل به آن انقیاد زودرس (به انگلیسی: early binding) و در زمان اجرا به انقیاد دیررس (به انگلیسی: late binding) معروف است.

جستارهای وابسته ویرایش

منابع ویرایش

  1. ۱٫۰ ۱٫۱ University of Michigan-Dearborn. "NAMES, BINDING, TYPE CHECKING, AND SCOPES". https://umdearborn.edu/cecs (به انگلیسی). Archived from the original on 7 September 2017. Retrieved 9 September 2017. {{cite web}}: External link in |وبگاه= (help)
  2. WG14 N1256 (2007 updated version of the C99 standard), 6.2.1 Scopes of identifiers, 2007-09-07
  3. The Go Programming Language Specification: Declarations and scope, Version of Nov 13, 2013
  4. WG14 N1256 (2007 updated version of the C99 standard), 6.2.1 Scopes of identifiers, 2007-09-07
  5. Borning A. CSE 341 -- Lexical and Dynamic Scoping. University of Washington.