تعیین دامنه ایستا و پویا — مفهوم Scoping در برنامه نویسی

در این مقاله ابتدا به شرح مفهوم Scope پرداخته شده که می‌توان آن را محدوده، دامنه، ناحیه یا بازه ترجمه کرد. همچنین تعیین دامنه در برنامه نویسی یا همان Scoping هم شرح داده شده است. انواع Scoping یعنی Static Scoping (تعیین دامنه ایستا) و Dynamic Scoping (تعیین دامنه پویا) نیز در این مطلب معرفی و شرح داده می‌شوند. پس از آن هم به تفاوت تعیین دامنه ایستا و پویا در برنامه نویسی پرداخته شده است. در این نوشتار برای هر یک از انواع Scoping در برنامه نویسی مثال‌هایی نیز ارائه می‌شوند.

Scoping چیست ؟ — تفاوت محدوده بندی ایستا و پویا در برنامه نویسی

Scoping چیست ؟ —  شرح مفهوم Scope در برنامه نویسی

Scope (دامنه | محدوده) یک متغیر x به ناحیه‌ای از برنامه گفته می‌شود که در آن استفاده از x به اعلان آن مربوط می‌شود. یکی از دلایل پایه‌ای برای ناحیه بندی (Scoping) این است که بتوان متغیرها را در بخش‌های مختلف برنامه از یکدیگر تفکیک کرد و برای آن‌ها تمایز قائل شد.

به دلیل اینکه تنها تعداد کمی از نام‌های کوتاه برای متغیرها وجود دارد و معمولاً برنامه نویسان عادت‌های مشترکی در خصوص نامگذاری متغیرها دارند (مثلاً نام i برای اندیس آرایه)، در هر برنامه‌ای با اندازه متوسط، از نام متغیر یکسانی در محدوده‌های مختلف استفاده می‌شود. بنابراین Scoping یا تعیین دامنه رویکردی ضروری در برنامه نویسی به حساب می‌آید.

انواع Scoping یا انواع تعیین دامنه در برنامه نویسی چیست ؟

به‌طور کلی تعیین دامنه یا همان Scoping در برنامه نویسی به ۲ دسته کلی تقسیم می‌شود:

  1. محدوده بندی ایستا
  2. محدوده بندی پویا

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

انواع Scope‌ در برنامه نویسی

تعیین دامنه ایستا یا Static Scoping در برنامه نویسی چیست ؟

علاوه بر «Static Scoping» به تعیین دامنه ایستا، «محدوده بندی ایستا» یا «ناحیه بندی ایستا»، «Lexical Scoping» (تعیین دامنه لغوی) هم گفته می‌شود. در این نوع از تعیین دامنه بالاترین سطح محیطی به عنوان محدوده یا دامنه متغیر در نظر گرفته می‌شود. این خصوصیتی در متن و کدهای نوشته شده در برنامه است و ارتباطی با پشته فراخوانی زمان اجرا (Run-Time Call Stack) ندارد.

علاوه بر این، استفاده از روش تعیین دامنه ایستا باعث می‌شود ایجاد کدهای ماژولار بسیار ساده‌تر شود و به همین دلیل برنامه نویس می‌تواند تنها با نگاه کردن به کدها متوجه محدوده یا همان Scope بشود. 

مثال Static Scoping در برنامه نویسی

در محدوده بندی پویا (Dynamic Scope) برنامه نویس باید تمام موارد پویای احتمالی را تخمین بزند. در بسیاری از زبان‌های برنامه نویسی شامل C++‎، C و جاوا، متغیرها همیشه به صورت ایستا یا لغوی تعیین دامنه می‌شوند. یعنی وابستگی یک متغیر را می‌توان با متن برنامه مشخص کرد و مستقل از پشته فراخوانی تابع در زمان اجرا است.

برای جمع‌بندی این بخش باید گفت در محدوده بندی یا Scoping ایستا (استاتیک) کامپایلر ابتدا در بلوک فعلی جستجو می‌کند و سپس به ترتیب در محدوده‌های کوچک‌تر این جستجو را انجام می‌دهد.

مثال Static Scope

خروجی برنامه زیر که به زبان C نوشته شده، عدد ۱۰ است؛ یعنی مقداری که به وسیله تابع f()‎ بازگردانده می‌شود، همواره مقدار متغیر سراسری x خواهد بود. در واقع، متغیر x تعریف شده در تابع g()‎ متغیر محلی است و فقط در محدوده تعریف این تابع سندیت دارد:

// A C program to demonstrate static scoping.
#include<stdio.h>
int x = 10;
 
// Called by g()
int f()
{
   return x;
}
 
// g() has its own variable
// named as x and calls f()
int g()
{
   int x = 20;
   return f();
}
 
int main()
{
  printf("%d", g());
  printf("\n");
  return 0;
}

تعیین دامنه پویا یا Dynamic Scoping در برنامه نویسی چیست ؟

در تعیین دامنه یا Scoping پویا، یک شناساگر سراسری (Global Identifier) به شناساگری مربوط به جدیدترین محیط اطلاق می‌شود و این مورد در زبان‌های برنامه نویسی امروزی و مدرن رایج نیست. به بیان فنی‌تر و دقیق‌تر، این یعنی هر شناساگر دارای پشته‌ای سراسری از وابستگی‌ها است و رخداد یک شناساگر در جدیدترین وابستگی جستجو می‌شود.

به بیان ساده، در تعیین دامنه پویا ، کامپایلر ابتدا بلوک فعلی را جستجو می‌کند و سپس جستجو را به ترتیب در تمام تابع‌های فراخوانی شده ادامه می‌دهد. حال در ادامه مثالی آمده است.

مثال Dynamic Scope

در ادامه مثالی به زبان C برای تعیین دامنه پویا ارائه شده است. با توجه به اینکه تعیین دامنه پویا در اکثر زبان‌های برنامه نویسی رایج استفاده نمی‌شود و وجود ندارد، شبه‌کدهای زیر به عنوان مثال Dynamic Scope ارائه شده‌اند. خروجی شبه‌کد زیر در زبانی که از Dynamic Scoping استفاده می‌کند، عدد ۲۰ خواهد بود:

int x = 10;
 
// Called by g()
int f()
{
   return x;
}
 
// g() has its own variable
// named as x and calls f()
int g()
{
   int x = 20;
   return f();
}
 
main()
{
  printf(g());
}

 

مقایسه تعیین دامنه ایستا با تعیین داکنه پویا در برنامه نویسی 

همان‌طور که پیش‌تر هم اشاره شد، در اکثر زبان‌های برنامه نویسی از رویکرد تعیین دامنه یا محدوده بندی ایستا استفاده می‌شود. دلیل این امر خیلی ساده است، فهم و درک Scoping ایستا آسان است و تنها با نگاه کردن به کدها می‌توان آن را متوجه شد. در واقع تنها با نگاه کردن به متن کدها در ویرایشگر کد می‌توان ملاحظه کرد که چه متغیرهایی در یک محدوده خاص قرار دارند.

در Dynamic Scoping یا همان تعیین دامنه پویا ، نحوه نوشته شدن کدها اهمیتی ندارند. بلکه نحوه اجرای برنامه در این رویکرد دارای اهمیت است. هر بار که یک تابع جدید اجرا می‌شود، محدوده جدیدی در پشته قرار داده می‌شود یا به اصطلاح Push می‌شود.

در زبان برنامه نویسی پرل (Perl) هم از Static Scoping و هم از Dynamic Scoping استفاده می‌شود. در زبان پرل با استفاده از کلمه کلیدی «my» یک متغیر محلی تعیین دامنه شده به صورت ایستا تعریف می‌شود. همچنین کلمه کلیدی «local» هم برای تعریف یک متغیر محلی با دامنه پویا مورد استفاده قرار می‌گیرد.

مثال Dynamic Scope در زبان Perl

در این بخش مثالی برای نشان دادن محدوده بندی پویا یا Dynamic Scoping در زبان برنامه نویسی پرل ارائه شده است:

# A perl code to demonstrate dynamic scoping
$x = 10;
sub f
{
   return $x;
}
sub g
{
   # Since local is used, x uses
   # dynamic scoping.
   local $x = 20;
 
   return f();
}
print g()."\n";

جمع‌بندی

در این مقاله سعی شد تا حد امکان به بیان ساده و خلاصه پیرامون مفهوم Scope در برنامه نویسی (محدوده یا ناحیه در برنامه نویسی) و تفاوت محدوده بندی  ایستا با ناحیه بندی پویا شرح داده شود. مثال‌هایی هم برای هر یک از این رویکردهای محدوده بندی ارائه شدند. امید است این مقاله مفید واقع شود. در صورتی که اشکالی در کدها یا هر جای دیگری از این مقاله وجود دارد، مخاطبان می‌توانند از طریق دیدگاه اطلاع بدهند تا مشکل بررسی و رفع شود.

اگر این مطلب مفید بوده است، استفاده از دوره‌های آموزشی و مطالب زیر نیز پیشنهاد می‌شوند:

 

منبع [+]

۲ نظر در "تعیین دامنه ایستا و پویا — مفهوم Scoping در برنامه نویسی"
    1. با سلام و احترام؛

      صمیمانه از همراهی شما با مجله فرادرس و ارائه بازخورد سپاس‌گزاریم.

      برای شما آرزوی سلامتی و موفقیت داریم.

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *