متغير محلي

في علوم الحاسوب ، المتغير المحلي هو متغير ذو نطاق محلي . يشير مرجع المتغير المحلي في الدالة أو الكتلة التي تم تعريفه فيها إلى نفس اسم المتغير في النطاق الأوسع. في لغات البرمجة ذات مستويين فقط من الرؤية، تُقارن المتغيرات المحلية بالمتغيرات العامة . من ناحية أخرى، تسمح العديد من اللغات المشتقة من ALGOL بأي عدد من مستويات الرؤية المتداخلة، مع إمكانية إخفاء المتغيرات الخاصة والدوال والثوابت والأنواع داخلها، إما عن طريق كتل متداخلة أو دوال متداخلة . تُعد المتغيرات المحلية أساسية في البرمجة الإجرائية ، وبشكل أعم في البرمجة المعيارية : تُستخدم المتغيرات ذات النطاق المحلي لتجنب مشاكل الآثار الجانبية التي قد تحدث مع المتغيرات العامة .

نِطَاق

قد يكون للمتغيرات المحلية نطاق معجمي أو ديناميكي ، مع أن النطاق المعجمي (الثابت) هو الأكثر شيوعًا. في النطاق المعجمي (أو النطاق الثابت)، إذا كان نطاق اسم متغير ما هو كتلة معينة، فإن نطاقه هو نص تعريف تلك الكتلة: داخل نص تلك الكتلة، يوجد اسم المتغير ويرتبط بقيمته، أما خارج نص تلك الكتلة، فلا وجود له. في المقابل، في النطاق الديناميكي، إذا كان نطاق اسم متغير ما هو كتلة معينة، فإن نطاقه هو تلك الكتلة وجميع الدوال التي تستدعيها بشكل متعدٍ (إلا عند إعادة تعريفها بتصريح آخر)؛ بعد انتهاء الكتلة، لا وجود لاسم المتغير. تسمح بعض اللغات، مثل بيرل وكومون ليسب ، للمبرمج باختيار النطاق الثابت أو الديناميكي عند تعريف متغير أو إعادة تعريفه. من أمثلة اللغات التي تستخدم النطاق الديناميكي: لغة Logo ، ولغة Emacs Lisp ، ولغات الصدفة bash و dash ، بالإضافة إلى تعريف "local" في صدفة Korn الخاصة بنظام MirBSD ( mksh ). أما معظم اللغات الأخرى فتُوفر متغيرات محلية ذات نطاق معجمي.

في معظم لغات البرمجة، تُخزَّن المتغيرات المحلية تلقائيًا مباشرةً في مكدس الاستدعاءات . هذا يعني أنه عند استدعاء دالة تكرارية لنفسها، تُخصَّص عناوين مميزة للمتغيرات المحلية في كل نسخة من الدالة . وبالتالي، يمكن تعريف المتغيرات ضمن هذا النطاق والكتابة إليها وقراءتها دون أي خطر لحدوث آثار جانبية على الدوال خارج نطاق الكتلة التي تم تعريفها فيها.

تُزوّد ​​لغات البرمجة التي تستخدم دلالات الاستدعاء بالقيمة الدالة الفرعية المُستدعاة بنسخة محلية خاصة بها من الوسائط المُمرّرة إليها. في معظم اللغات، تُعامل هذه المعاملات المحلية معاملة المتغيرات المحلية الأخرى داخل الدالة الفرعية. في المقابل، تسمح دلالات الاستدعاء بالمرجع والاستدعاء بالاسم للمعاملات بأن تعمل كاسم بديل للقيم المُمرّرة كوسائط، مما يُتيح للدالة الفرعية تعديل المتغيرات خارج نطاقها.

المتغيرات المحلية الثابتة

يتوفر نوع خاص من المتغيرات المحلية، يُسمى المتغير المحلي الثابت، في العديد من لغات البرمجة الشائعة (بما في ذلك C / C++ ، و Visual Basic ، و VB.NET ، و PHP )، يسمح بالاحتفاظ بقيمة المتغير من استدعاء لآخر للدالة - فهو متغير ثابت ذو نطاق محلي. في هذه الحالة، يمكن للاستدعاءات المتكررة للدالة الوصول إلى المتغير (الثابت الوحيد المُخصص بشكل ثابت ). في جميع اللغات المذكورة أعلاه، تُعلن المتغيرات الثابتة باستخدام كلمة مفتاحية خاصة بفئة التخزين (مثلاً، `static` static).

تتمتع المتغيرات المحلية الثابتة في الدوال العامة بنفس عمر المتغيرات العامة الثابتة ، لأن قيمتها تبقى في الذاكرة طوال عمر البرنامج، [ 1 ] ولكن لها نطاق دالة (وليس نطاقًا عامًا)، كما هو الحال مع المتغيرات المحلية التلقائية.

يختلف هذا عن الاستخدامات الأخرى للكلمة staticالمفتاحية ، والتي لها عدة معانٍ مختلفة في لغات مختلفة.

المتغيرات المحلية في لغة بيرل

يدعم بيرل كلاً من المتغيرات المحلية الديناميكية والمتغيرات المحلية ذات النطاق المعجمي. تُستخدم الكلمة المفتاحية `<div>` localلتعريف المتغيرات المحلية الديناميكية، بينما myتُستخدم `<div>` للمتغيرات المحلية ذات النطاق المعجمي. ونظرًا لأن النطاق الديناميكي أقل شيوعًا اليوم، تُحذر وثائق بيرل من أن `<div>` localليس ما يُفهم عادةً على أنه "محلي". [ 2 ] بدلاً من ذلك، localتُعطي الكلمة المفتاحية `<div>` قيمة مؤقتة ذات نطاق ديناميكي لمتغير عام (حزمة)، وتستمر هذه القيمة حتى نهاية الكتلة المُحيطة. ومع ذلك، يكون المتغير مرئيًا لأي دالة يتم استدعاؤها من داخل الكتلة. [ 3 ] لإنشاء متغيرات محلية ذات نطاق معجمي، استخدم myالمعامل `<div>` بدلاً من ذلك. [ 4 ]

لفهم كيفية عملها، انظر إلى الكود التالي:

$a = 1 ; sub f () { local $a ; $a = 2 ; g (); } sub g () { print "$a\n" ; } g (); f (); g ();

سينتج عن هذا ما يلي:

1 2 1

يحدث هذا لأن المتغير العام $a يتم تعديله إلى معنى مؤقت جديد (محلي) داخل f()، ولكن يتم استعادة القيمة العامة عند مغادرة نطاق f().

استخدام `in` myفي هذه الحالة بدلاً من `in` localكان سيؤدي إلى طباعة الرقم 1 ثلاث مرات، لأن $aالمتغير في هذه الحالة سيكون محصورًا في النطاق الثابت للدالة f()ولن يراه `in` g(). ويجادل راندال إل. شوارتز وتوم فينيكس بأن المعامل localكان يجب أن يحمل اسمًا مختلفًا مثل `in` save. [ 5 ]

المتغيرات المحلية في لغة روبي

استُلهمت لغة روبي أيضًا من لغة بيرل، ولكن في هذه الحالة، تم تبسيط الترميز: يجب أن يسبق اسم المتغير العام علامة $، مثل `$` $variable_name، بينما لا يسبق اسم المتغير المحلي علامة $، مثل `$ variable_name` (بينما في بيرل، تسبق علامة $ جميع القيم العددية). تجدر الإشارة إلى أن روبي توفر دعمًا مدمجًا للمتغيرات المحلية ذات النطاق الثابت فقط، مثل `$` في بيرل my، وليس للمتغيرات المحلية ذات النطاق الديناميكي local. يوجد على الأقل مكتبة واحدة في روبي توفر دعمًا للمتغيرات ذات النطاق الديناميكي. [ 6 ]

انظر أيضاً

مراجع

  1. "المعيار الحالي للغة C" (ملف PDF) . (3.61  ميجابايت) ( اعتبارًا من عام 2009)). على وجه الخصوص، انظر القسم 6.2.4 "مدة تخزين الكائنات"، الصفحة 32.
  2. perldoc.perl.org: محلي
  3. perldoc.perl.org: perlsub: القيم المؤقتة عبرlocal()
  4. perldoc.perl.org: perlsub: المتغيرات الخاصة عبرmy()
  5. راندال ل. شوارتز وتوم فينيكس (1 يوليو 2001). تعلم لغة بيرل، الطبعة الثالثة . أورايلي. الفقرة 4.7. ISBN 0-596-00132-0.
  6. كونراد إيروين. "LSpace: نطاق ديناميكي للغة روبي". ديسمبر 2012 http://cirw.in/blog/lspace تم الاطلاع عليه بتاريخ 16-10-2013.