مجال (علم الحاسوب)
النطاق الديناميكي

مع النطاق الديناميكي ، يشير المعرّف العام إلى المعرف المرتبط بالبيئة الأحدث ، وهو غير شائع في اللغات الحديثة. [4] من الناحية الفنية ، يعني هذا أن كل معرّف يحتوي على كدسة عالمية للارتباطات. إدخال متغير محلي بالاسم x يدفع الربط إلى x stack العام (والذي قد يكون فارغًا)، والذي يتم إفراغه عندما يترك تدفق التحكم النطاق. يؤدي تقييم x في أي سياق دائمًا إلى الحصول على الرابط العلوي. لاحظ أن هذا لا يمكن القيام به في وقت التحويل البرمجي لأن رصة الربط موجودة فقط في وقت التشغيل ، وهذا هو السبب في أن هذا النوع من scoping يُسمى scoping الديناميكي.
بشكل عام ، يتم تعريف كتل معينة لإنشاء الارتباطات التي يكون عمرها هو وقت تنفيذ الكتلة ؛ هذا يضيف بعض ميزات الفحص الثابت إلى عملية تحديد النطاق الديناميكي. ومع ذلك ، بما أنه يمكن استدعاء جزء من الكود من العديد من المواقع والحالات المختلفة ، فقد يكون من الصعب تحديد ما هي الارتباطات التي سيتم تطبيقها عند استخدام المتغير (أو وجوده على الإطلاق) في البداية. هذا يمكن أن يكون مفيدا ؛ إن تطبيق مبدأ أقل قدر من المعرفة يشير إلى أن الشفرة تتجنب اعتمادًا على أسباب (أو ظروف) قيمة المتغير ، ولكن ببساطة استخدم القيمة وفقًا لتعريف المتغير. يمكن أن يوفر هذا التفسير الضيق للبيانات المشتركة نظامًا مرنًا للغاية لتكييف سلوك إحدى الوظائف مع الحالة (أو السياسة) الحالية للنظام. ومع ذلك ، تعتمد هذه المنفعة على توثيق دقيق لجميع المتغيرات المستخدمة بهذه الطريقة وكذلك على تجنب الحذر من الافتراضات حول سلوك المتغير ، ولا توفر أي آلية للكشف عن التداخل بين أجزاء مختلفة من البرنامج. يفحص النطاق الديناميكي أيضًا جميع مزايا الشفافية المرجعية. على هذا النحو ، يمكن أن يكون تحديد النطاق الديناميكي خطيراً وقليلًا من اللغات الحديثة تستخدمه. بعض اللغات ، مثل Perl و Common Lisp ، تسمح للمبرمج باختيار scoping ثابت أو ديناميكي عند تعريف أو إعادة تعريف متغير. تتضمن أمثلة اللغات التي تستخدم نطاقًا ديناميكيًا الشعار ، و Emacs Lisp ، و bash languages bash ، وشرطة ، و PowerShell.
عملية تحديد النطاق الديناميكي سهلة التنفيذ. للعثور على قيمة المعرف ، يمكن أن يجتاز البرنامج مكدس وقت التشغيل ، ويتحقق من كل سجل تنشيط (إطار كد لكل دالة) للحصول على قيمة للمعرف. من الناحية العملية ، يصبح هذا أكثر كفاءة من خلال استخدام قائمة الارتباطات ، وهي عبارة عن مجموعة من أزواج الاسم / القيمة. يتم دفع الأزواج إلى هذه المكدس عندما يتم إصدار الإعلانات ، ويتم بروزها عندما تخرج المتغيرات من نطاقها.  الربط الضحل هو إستراتيجية بديلة أسرع بشكل كبير ، حيث تستخدم جدول مرجعي مركزي ، يربط كل اسم بمجموعته الخاصة من المعاني. هذا يتجنب البحث الخطي أثناء وقت التشغيل للعثور على اسم معين ، ولكن يجب الانتباه إلى الحفاظ على هذا الجدول بشكل صحيح.  لاحظ أن كلا هذين الاستراتيجيتين يفترضان ترتيبًا أخيرًا في أول (LIFO) لترتيب ارتباطات لأي متغير واحد ؛ في الممارسة يتم ترتيب كل الارتباطات.
والتطبيق الأكثر بساطة هو تمثيل المتغيرات الديناميكية مع المتغيرات العالمية البسيطة. يتم تنفيذ الربط المحلي عن طريق حفظ القيمة الأصلية في موقع مجهول على المكدس غير المرئي للبرنامج. عندما ينتهي نطاق الربط هذا ، يتم استعادة القيمة الأصلية من هذا الموقع. في الواقع ، نشأ نطاق ديناميكي بهذه الطريقة. استخدمت التطبيقات المبكرة لـ Lisp هذه الاستراتيجية الواضحة لتنفيذ المتغيرات المحلية ، وتبقى هذه الممارسة في بعض اللهجات التي لا تزال قيد الاستخدام ، مثل GNU Emacs Lisp. تم تقديم نطاق المعجمية في Lisp في وقت لاحق. وهذا يعادل مخطط الربط الضحلة أعلاه ، فيما عدا أن الجدول المرجعي المركزي هو ببساطة بيئة الربط المتغيرة العالمية ، التي يكون فيها المعنى الحالي للمتغير هو قيمته العالمية. الحفاظ على المتغيرات العالمية ليست معقدة. على سبيل المثال ، يمكن أن يحتوي كائن الرمز على فتحة مخصصة لقيمته العمومية.
يوفر النطاق الديناميكي تجريدًا ممتازًا للتخزين المحلي لمؤشر الترابط ، ولكن إذا تم استخدامه بهذه الطريقة ، فلا يمكن أن يستند إلى حفظ واستعادة متغير عام. إستراتيجية تنفيذ محتملة هي أن يكون لكل متغير مفتاح مؤشر ترابط محلي. عند الوصول إلى المتغير ، يتم استخدام مفتاح مؤشر الترابط المحلي للوصول إلى موقع ذاكرة مؤشر الترابط المحلي (بواسطة رمز تم إنشاؤه بواسطة المحول البرمجي ، والذي يعرف المتغيرات التي تكون ديناميكية والتي تكون معجمية). إذا كان مفتاح مؤشر الترابط المحلي غير موجود لمؤشر الترابط المتصل ، فسيتم استخدام الموقع العام. عندما يكون المتغير مرتبطًا محليًا ، يتم تخزين القيمة السابقة في موقع مخفي على المكدس. يتم إنشاء تخزين مؤشر الترابط المحلي تحت مفتاح المتغير ، ويتم تخزين القيمة الجديدة هناك. مزيد من التجاوزات المتداخلة للمتغير داخل هذا الموضوع ببساطة حفظ واستعادة هذا الموقع المحلي. عندما ينتهي النطاق المبدئي .