مجال (علم الحاسوب)
نظرة عامة

عند مناقشة النطاق، هناك ثلاثة مفاهيم أساسية: النطاق، والمدى، والسياق. غالبًا ما يتم الخلط بين «النطاق» و «السياق» بشكل خاص: النطاق عبارة عن خاصية لمعرّف، ويتم إصلاحه، في حين أن السياق عبارة عن خاصية لبرنامج، يختلف باختلاف الموقع. بتعبير أدق، السياق هو خاصية لموضع في البرنامج، إما موضع في شفرة المصدر (سياق معجم) أو نقطة خلال وقت التشغيل (سياق التنفيذ، سياق وقت التشغيل، أو سياق الاتصال). يتكون سياق التنفيذ من سياق معجم (عند نقطة التنفيذ الحالية) بالإضافة إلى حالة وقت تشغيل إضافية مثل مكدس الاستدعاءات. وهكذا، عندما تكون نقطة تنفيذ البرنامج في نطاق اسم المتغير، يكون «المتغير (الاسم) السياق»(يعني«في السياق عند هذه النقطة»)، وعندما تخرج نقطة التنفيذ«نطاق (اسم) متغير»، مثل بالعودة من دالة، «يخرج المتغير (الاسم) خارج السياق» تحدث بشكل ضيق، أثناء التنفيذ، يدخل البرنامج ويخرج من نطاقات مختلفة، وعند نقطة في التنفيذ، تكون المعرفات «في سياق» أو «ليس في سياق»، ومن ثم، فإن المعرفات «تأتي في سياق» أو «تخرج عن سياقها». كما يدخل البرنامج أو يخرج من النطاق - ولكن في الممارسة العملية هو أكثر مرونة.
نطاق هو مفهوم مستوى التعليمات البرمجية المصدر، وخصائص معرفات، وخاصة أسماء متغير أو وظيفة - المعرفات في شفرة المصدر هي إشارات إلى الكيانات في البرنامج - ويشكل جزءا من سلوك المترجم أو مترجم للغة. على هذا النحو، فإن قضايا النطاق تشبه المؤشرات، والتي هي نوع من أنواع المراجع المستخدمة في البرامج بشكل عام. إن استخدام قيمة متغير عندما يكون الاسم في السياق ولكن المتغير غير مهيأ هو مماثل لإلغاء الإشارة (الوصول إلى قيمة) مؤشر wild ، لأنه غير معرف. ومع ذلك، نظرًا لأن المتغيرات لا يتم إتلافها حتى تخرج عن سياقها، لا يوجد تناظري لمؤشر متدلي.
بالنسبة للكيانات مثل المتغيرات، النطاق هو مجموعة فرعية من العمر (يُعرف أيضًا بمدى) - يمكن أن يشير الاسم فقط إلى متغير موجود (ربما مع قيمة غير محددة)، ولكن المتغيرات الموجودة ليست بالضرورة مرئية: قد يوجد متغير ولكن لا يمكن الوصول إليها (يتم تخزين القيمة ولكن لا يشار إليها في سياق معين)، أو يمكن الوصول إليها ولكن ليس عن طريق الاسم المحدد، وفي هذه الحالة يكون خارج السياق (البرنامج «خارج نطاق الاسم»). في حالات أخرى، «العمر» غير ذي صلة - العلامة (المسمى بموضع في شفرة المصدر) لها عمر متطابق مع البرنامج (للغات المجمعة بشكل ثابت)، ولكنها قد تكون داخل أو خارج السياق في نقطة معينة في البرنامج، وبالمثل للمتغيرات الثابتة - المتغير العام الثابت في سياق البرنامج بأكمله، بينما يكون المتغير المحلي الثابت في السياق فقط داخل دالة أو سياق محلي آخر، ولكن كلاهما له عمر كامل لتشغيل البرنامج.
ويعرف تحديد الكيان الذي يشير إليه المعرف باسم تحليل الاسم أو ربط الاسم (خاصة في البرمجة الشيئية)، ويختلف بين اللغات. في ضوء معرف معين، تقوم اللغة (بشكل صحيح، المحول البرمجي أو المترجم) بفحص جميع الكيانات الموجودة في سياق التطابقات؛ في حالة الغموض (كيانان لهما نفس الاسم، مثل متغير عالمي ومحلي بنفس الاسم)، يتم استخدام قواعد تحليل الاسم لتمييزها. في كثير من الأحيان، تعتمد دقة الاسم على قاعدة «داخلية إلى خارجية»، مثل قاعدة Python LEGB (محلي، مضمن، عالمي، مدمج): تتضمّن الأسماء ضمنيًا إلى أضيق سياق ذي صلة. في بعض الحالات، يمكن تحديد دقة الاسم بوضوح، مثل الكلمات الرئيسية العامة وغير المحلية في بايثون؛ في حالات أخرى لا يمكن تجاوز القواعد الافتراضية.
عندما يكون هناك معرّفان متطابقان في السياق في نفس الوقت، في إشارة إلى الكيانات المختلفة، يقول أحدهم أن إخفاء الاسم يحدث، حيث يكون الاسم ذو الأولوية الأعلى (عادةً أعمق) هو «إخفاء» اسم الأقل أولوية. على مستوى المتغيرات، يعرف هذا باسم التظليل المتغير. نظرًا لاحتمالية حدوث أخطاء منطقية من الإخفاء، فإن بعض اللغات لا تسمح أو تمنع الإخفاء، وترفع خطأ أو تحذيرًا في وقت الترجمة أو وقت التشغيل.
تحتوي لغات البرمجة المختلفة على قواعد تحديد نطاق مختلفة لأنواع مختلفة من الإعلانات والمعرفات. هذه القواعد تحديد نطاق لها تأثير كبير على دلالات اللغة، وبالتالي، على سلوك وصحة البرامج. في اللغات مثل++ C ، لا يحتوي الوصول إلى متغير غير منضم على دلالات محددة بدقة وقد يؤدي إلى سلوك غير محدد، مشابهًا للإشارة إلى مؤشر متدلي ؛ والتوضيحات أو المعرفات المستخدمة خارج نطاقها ستؤدي إلى حدوث أخطاء في بناء الجملة.
ترتبط النطاقات بشكل متكرر ببنى لغة أخرى ويتم تحديدها ضمنيًا، ولكن العديد من اللغات تقدم أيضًا بنيات خصيصًا للتحكم في النطاق.