مجال (علم الحاسوب)
كتلة النطاق

تسمح العديد من لغات البرمجة المهيكلة للكتل ، وليس كلها ، بتقييد النطاق على كتلة ، والتي تعرف باسم نطاق الكتلة. بدأ هذا بـ ALGOL 60، حيث «[...] الإعلان ... صحيح فقط لهذه الكتلة.»،  واليوم يرتبط بشكل خاص باللغات في عائلة باسكال وجيم وتقاليدها. غالباً ما يتم احتواء هذه الكتلة داخل دالة ، وبالتالي تقييد النطاق إلى جزء من الدالة ، ولكن في بعض الحالات ، مثل Perl ، قد لا تكون الكتلة داخل دالة.
unsigned int sum_of_squares(const unsigned int N) {
  unsigned int ret = 0;
  for (unsigned int n = 1; n <= N; n++) {
    const unsigned int n_squared = n * n;
    ret += n_squared;
  }
  return ret;
}
المثال المعتمد لاستخدام نطاق المنع هو الكود C الموضح هنا ، حيث يتم تحديد نطاق متغيرين للحلقة: المتغير n، الذي تتم تهيئته مرة واحدة ويزداد في كل تكرار للحلقة ، والمتغير المساعد n_squared ، والذي تتم التهيئة في كل تكرار. والغرض من ذلك هو تجنب إضافة متغيرات إلى نطاق الدوال ذي الصلة فقط بكتلة معينة - على سبيل المثال ، يمنع الأخطاء حيث تم بالفعل تعيين متغير الحلقة العامة الذي قمت بطريق الخطأ إلى قيمة أخرى. في هذا المثال ، لن يتم تعيين تعبير n * nبشكل عام لمتغير مساعد ، وببساطة يكون نص الحلقة مكتوبًا ret += n * n ولكن في الأمثلة الأكثر تعقيدًا تكون المتغيرات المساعدة مفيدة.
تستخدم الكتل في المقام الأول لتدفق التحكم ، كما هو الحال في حالة ، بينما ، وللحلقة ، وفي هذه الحالات ، فإن نطاق الكتلة يعني أن نطاق المتغير يعتمد على بنية تدفق تنفيذ الدالة. ومع ذلك ، فإن اللغات ذات نطاق الكتل تسمح عادةً باستخدام الكتل «المجردة»، التي يكون غرضها الوحيد هو السماح بالتحكم الدقيق في النطاق المتغير. على سبيل المثال ، يمكن تعريف المتغير الإضافي في كتلة ، ثم استخدامه (على سبيل المثال ، إضافة إلى متغير مع نطاق الوظيفة) والتخلص منه عند انتهاء الكتلة ، أو قد تكون حلقة أثناء محاطة بكتلة تقوم بتهيئة المتغيرات المستخدمة داخل الحلقة يجب أن يتم تهيئتها مرة واحدة فقط.
إن دقة العديد من لغات البرمجة ، مثل Algol 68 و C (كما هو موضح في هذا المثال والموحدة القياسية منذ C99)، هي أنه يمكن الإعلان عن متغيرات نطاق الكتلة ليس فقط داخل جسم الكتلة بل أيضًا ضمن بيان التحكم ، إذا أي. ويماثل ذلك مع معلمات الدالة ، التي يتم تعريفها في تعريف الدالة (قبل بدء تشغيل كتلة الدالة)، وفي نطاق جسم الوظيفة بالكامل. يُستخدم هذا بشكل أساسي في الحلقات ، التي تحتوي على عبارة التهيئة منفصلة عن حالة الحلقة ، على عكس الحلقات ، وهي لغة شائعة.
يمكن استخدام نطاق الحظر للتظليل. في هذا المثال ، داخل الكتلة ، يمكن أيضًا تسمية المتغير المساعد n ، وتظليل اسم المعلمة ، ولكن هذا يعتبر أسلوبًا سيئًا نظرًا لاحتمالية حدوث أخطاء. علاوة على ذلك ، بعض المتحدرين من C ، مثل Java و C # ، على الرغم من وجود دعم لنطاق الكتلة (حيث يمكن جعل متغير محلي يخرج من النطاق قبل نهاية الدالة)، لا تسمح لمتغير محلي واحد بإخفاء آخر . في مثل هذه اللغات ، قد يؤدي محاولة إعلان n الثاني إلى حدوث خطأ في بناء الجملة ، وسيتعين إعادة تسمية أحد المتغيرات n.
إذا تم استخدام قالب لتعيين قيمة متغير ، يتطلب نطاق الكتلة أن يتم الإعلان عن المتغير خارج الكتلة. هذا يعقد استخدام البيانات الشرطية مع مهمة واحدة. على سبيل المثال ، في بايثون ، التي لا تستخدم نطاق الحظر ، يمكن للمرء أن يهيئ المتغير على هذا النحو:
if c:
    a = 'foo'
else:
    a = ''
حيث يمكن الوصول إليها بعد العبارة if.
في Perl ، الذي يحتوي على نطاق الحظر ، يتطلب ذلك بدلاً من ذلك تحديد المتغير قبل الكتلة:
my $a;
if (c) {
  $a = 'foo';
} else {
  $a = '';
}
غالبًا ما يتم إعادة الكتابة بدلاً من ذلك باستخدام تعيين متعدد ، مع تهيئة المتغير إلى قيمة افتراضية. في بايثون (حيث لا يكون ضروريًا) على هذا النحو:
a = ''
if c:
    a = 'foo'
بينما في Perl سيكون هكذا:
my $a = '';
if (c) {
    $a = 'foo';
}
في حالة تخصيص متغير واحد ، يكون البديل هو استخدام المشغل الثلاثي لتجنب كتلة ، ولكن هذا ليس ممكنًا بشكل عام لتخصيصات متعددة ومتغيرة ، ويصعب قراءته بالنسبة للمنطق المعقّد.
هذه مشكلة أكثر أهمية في C ، خاصةً لتخصيص السلسلة ، حيث يمكن أن تقوم تهيئة السلسلة تلقائيًا بتخصيص الذاكرة ، بينما يتطلب تعيين سلسلة إلى متغير تم تهيئته بالفعل تخصيص الذاكرة ونسخة سلسلة والتحقق من نجاحها.
sub increment_counter () 
{ 
    my $counter = 0;
    return sub ()
    {
        return ++$counter;
    }
}
تسمح بعض اللغات بمفهوم نطاق الكتلة ليتم تطبيقه ، بدرجات متفاوتة ، خارج الدالة. على سبيل المثال ، في مقطع Perl على اليمين ، $ counter هو اسم متغير بنطاق كتلة (بسبب استخدام الكلمة الرئيسية الخاصة بي)، بينما increment_counter هو اسم دالة بنطاق عالمي. ستزيد كل مكالمة إلى increment_counter من قيمة العداد بالدولار الواحد وتعيد القيمة الجديدة. يمكن أن يؤدي الرمز خارج هذا الحظر إلى الاتصال بـ increment_counter ، ولكن لا يمكنه الحصول على قيمة العداد بالدولار أو تغييره. هذا المصطلح يسمح للمرء بتعريف الإغلاق في perl.