متغير غير محلي
في نظرية لغات البرمجة ، المتغير غير المحلي هو متغير غير مُعرَّف في النطاق المحلي . ورغم أن المصطلح قد يشير إلى المتغيرات العامة ، إلا أنه يُستخدم بشكل أساسي في سياق الدوال المتداخلة والمجهولة، حيث قد لا تكون بعض المتغيرات ضمن النطاق المحلي أو العام .
أمثلة
الدوال المتداخلة
في مثال بايثون 3 التالي، توجد دالة متداخلة innerمُعرَّفة ضمن نطاق دالة أخرى outer. المتغير xمحلي للدالة الأولى outer، ولكنه غير محلي للدالة الثانية inner(ولا هو عام أيضًا).
من typing استورد Callabledef outer () -> Callable [[], None ]: x : int = 1 def inner () -> None : nonlocal x x += 1 print ( x ) return innerفي جافا سكريبت، يُحدد موضع المتغير بناءً على أقرب varعبارة برمجية لهذا المتغير. في المثال التالي، xالمتغير x موضعي بالنسبة إلى المتغير outery لأنه يحتوي على var xعبارة برمجية، بينما المتغير innerx لا يحتوي عليها. لذلك، فإن x غير موضعي بالنسبة إلى المتغير innery.
دالة خارجية ( ) { متغير x = 1 ؛ دالة داخلية () { x += 1 ؛ console.log ( x ) ؛ } إرجاع داخلي ؛ }الوظائف المجهولة
في مثال Haskell التالي، يكون المتغير cغير محلي في الدالة المجهولة \x -> x + c:
outer = let c = 1 in map ( \ x -> x + c ) [ 1 , 2 , 3 , 4 , 5 ]مشاكل التنفيذ
تُعد المتغيرات غير المحلية السبب الرئيسي لصعوبة دعم الدوال المتداخلة والمجهولة وذات الرتبة العليا ، وبالتالي الدوال من الدرجة الأولى في لغة البرمجة.
إذا كانت الدالة أو الدوال المتداخلة متكررة (بشكل متبادل) ، يصبح من الصعب على المترجم تحديد مكان تخصيص المتغير غير المحلي بدقة على مكدس الاستدعاءات ، لأن مؤشر الإطار يشير فقط إلى المتغير المحلي للدالة المتداخلة نفسها، وقد يكون هناك عدد غير محدد من سجلات التنشيط على المكدس بينها. ويتم حل هذه المشكلة عادةً باستخدام روابط الوصول أو سجلات العرض .
إذا تم تمرير الدالة المتداخلة كوسيط إلى دالة من الرتبة العليا، فسيلزم إنشاء إغلاق لتحديد موقع المتغيرات غير المحلية. أما إذا تم إرجاع الدالة المتداخلة كنتيجة من دالتها الخارجية (أو تخزينها في متغير)، فلن تكون المتغيرات غير المحلية متاحة على المكدس. بل يجب تخصيصها في الكومة، ويمتد عمرها إلى ما بعد عمر الدالة الخارجية التي أعلنتها وخصصتها. وهذا يتطلب عادةً عملية جمع البيانات المهملة.
ملحوظات
مراجع
- أهو، لام، سيثي، وأولمان. "7.3 الوصول إلى البيانات غير المحلية على المكدس". المترجمات: المبادئ والتقنيات والأدوات . الطبعة الثانية.
- نظرية لغات البرمجة
- متغير (علوم الحاسوب)
