متغير محلي
في علوم الكمبيوتر ، المتغير المحلي هو متغير له نطاق محلي . إن مرجع المتغير المحلي في الدالة أو الكتلة التي تم إعلانه فيها يتجاوز نفس اسم المتغير في النطاق الأكبر. في لغات البرمجة ذات مستويين فقط من الرؤية، يتم مقارنة المتغيرات المحلية بالمتغيرات العالمية . من ناحية أخرى، تسمح العديد من اللغات المشتقة من ALGOL بأي عدد من مستويات الرؤية المتداخلة، مع وجود متغيرات ووظائف وثوابت وأنواع خاصة مخفية داخلها، إما عن طريق كتل متداخلة أو وظائف متداخلة . المتغيرات المحلية أساسية للبرمجة الإجرائية ، وبشكل عام البرمجة المعيارية : تُستخدم متغيرات النطاق المحلي لتجنب المشكلات المتعلقة بالآثار الجانبية التي يمكن أن تحدث مع المتغيرات العالمية .
نِطَاق
قد يكون للمتغيرات المحلية نطاق معجمي أو ديناميكي ، على الرغم من أن النطاق المعجمي (الثابت) أكثر شيوعًا. في النطاق المعجمي (أو النطاق المعجمي؛ ويسمى أيضًا النطاق الثابت أو النطاق الثابت)، إذا كان نطاق اسم المتغير كتلة معينة، فإن نطاقه هو نص البرنامج لتعريف الكتلة: داخل نص تلك الكتلة، يوجد اسم المتغير، وهو مرتبط بقيمة المتغير، ولكن خارج نص تلك الكتلة، لا يوجد اسم المتغير. على النقيض من ذلك، في النطاق الديناميكي (أو النطاق الديناميكي)، إذا كان نطاق اسم المتغير كتلة معينة، فإن نطاقه هو تلك الكتلة وجميع الوظائف التي يتم استدعاؤها بشكل انتقالي بواسطة تلك الكتلة (باستثناء عندما يتم تجاوزها مرة أخرى بواسطة إعلان آخر)؛ بعد انتهاء الكتلة، لا يوجد اسم المتغير. تسمح بعض اللغات، مثل Perl و Common Lisp ، للمبرمج باختيار النطاق الثابت أو الديناميكي عند تعريف متغير أو إعادة تعريفه. تتضمن أمثلة اللغات التي تستخدم النطاق الديناميكي Logo و Emacs lisp ولغات shell bash و dash وإعلان "local" الخاص بـ MirBSD Korn shell ( mksh ). توفر معظم اللغات الأخرى متغيرات محلية ذات نطاق معجمي.
في أغلب اللغات، المتغيرات المحلية هي متغيرات تلقائية مخزنة على مكدس النداء مباشرةً. وهذا يعني أنه عندما تستدعي دالة متكررة نفسها، يتم إعطاء المتغيرات المحلية في كل مثيل من الدالة عناوين مميزة . وبالتالي، يمكن إعلان المتغيرات من هذا النطاق وكتابتها وقراءتها، دون أي خطر من الآثار الجانبية للوظائف خارج الكتلة التي تم إعلانها فيها.
توفر لغات البرمجة التي تستخدم دلالات الاستدعاء بالقيمة برنامجًا فرعيًا يتم استدعاؤه بنسخة محلية خاصة به من الوسائط التي يتم تمريرها إليه. في معظم اللغات، يتم التعامل مع هذه المعلمات المحلية بنفس الطريقة التي يتم بها التعامل مع المتغيرات المحلية الأخرى داخل البرنامج الفرعي. على النقيض من ذلك، تسمح دلالات الاستدعاء بالإشارة والاستدعاء بالاسم للمعلمات بالعمل كأسماء مستعارة للقيم التي يتم تمريرها كوسائط، مما يسمح للبرنامج الفرعي بتعديل المتغيرات خارج نطاقه الخاص.
المتغيرات المحلية الثابتة
يتوفر نوع خاص من المتغيرات المحلية، يسمى متغير محلي ثابت، في العديد من اللغات السائدة (بما في ذلك C / C++ و Visual Basic و VB.NET و PHP ) والذي يسمح بالاحتفاظ بقيمة من استدعاء وظيفة إلى أخرى - إنه متغير ثابت بنطاق محلي. في هذه الحالة، تتمتع الاستدعاءات المتكررة للوظيفة أيضًا بالوصول إلى المتغير (single, statically Customized ). في جميع اللغات المذكورة أعلاه، يتم إعلان المتغيرات الثابتة على هذا النحو باستخدام كلمة رئيسية خاصة بفئة التخزين (على سبيل المثال، static).
تتمتع المتغيرات المحلية الثابتة في الوظائف العالمية بنفس عمر المتغيرات العالمية الثابتة ، لأن قيمتها تظل في الذاكرة طوال عمر البرنامج، [1] ولكنها لها نطاق وظيفة (وليس نطاقًا عالميًا)، كما هو الحال مع المتغيرات المحلية التلقائية.
وهذا يختلف عن الاستخدامات الأخرى للكلمة staticالأساسية ، والتي لها معاني مختلفة في لغات مختلفة.
المتغيرات المحلية في بيرل
يدعم Perl كلًا من المتغيرات المحلية الديناميكية والمحددة بالمعجم. localتُستخدم الكلمة الأساسية لتحديد المتغيرات المحلية ذات النطاق الديناميكي، بينما myتُستخدم للمتغيرات المحلية ذات النطاق المعجمي. نظرًا لأن التحديد الديناميكي أقل شيوعًا اليوم، فإن وثائق Perl تحذر من أن " localليس ما يعتقده معظم الناس على أنه "محلي".". [2] بدلاً من ذلك، localتعطي الكلمة الأساسية قيمة مؤقتة ذات نطاق ديناميكي لمتغير عالمي (حزمة)، والتي تستمر حتى نهاية الكتلة المحيطة. ومع ذلك، يكون المتغير مرئيًا لأي دالة يتم استدعاؤها من داخل الكتلة. [3] لإنشاء متغيرات محلية ذات نطاق معجمي، استخدم myالمشغل بدلاً من ذلك. [4]
لفهم كيفية عمله، ضع في اعتبارك الكود التالي:
$a = 1 ؛ sub f () { محلي $a ؛ $a = 2 ؛ g ()؛ } sub g () { طباعة "$a\n" ؛ } g ()؛ f ()؛ g ()؛
سيؤدي هذا إلى الإخراج:
1 2 1
يحدث هذا منذ أن تم تعديل المتغير العالمي $a إلى معنى مؤقت (محلي) جديد داخل f()، ولكن يتم استعادة القيمة العالمية عند مغادرة نطاق f().
إن استخدام myفي هذه الحالة بدلاً من localكان ليؤدي إلى طباعة الرقم 1 ثلاث مرات، حيث إن $aالمتغير في هذه الحالة سيكون محصورًا في النطاق الثابت للوظيفة f()ولن يراه g().
يزعم راندال إل شوارتز وتوم فينيكس أن المشغل localكان يجب أن يكون له اسم مختلف مثل save. [5]
المتغيرات المحلية في روبي
كانت لغة Ruby$variable_name مستوحاة أيضًا من Perl، ولكن في هذه الحالة، تم تبسيط التدوين: يجب أن يسبق اسم المتغير العالمي علامة $، مثل ، بينما لا يوجد ببساطة علامة $ أمام اسم المتغير المحلي، مثل variable_name(بينما في Perl تحتوي جميع القيم القياسية على علامة $ أمامها). لاحظ أن Ruby توفر فقط دعمًا مدمجًا للمتغيرات المحلية ذات النطاق الثابت مثل Perl my، وليس المتغيرات المحلية ذات النطاق الديناميكي مثل Perl local. يوجد على الأقل مكتبة واحدة لـ Ruby توفر متغيرات ذات نطاق ديناميكي.
[6]
انظر أيضا
مراجع
- ^ "المعيار C الحالي" (PDF) . (3.61 ميجا بايت) (اعتبارًا من عام 2009 [تحديث]). على وجه الخصوص، راجع القسم 6.2.4 "مدة تخزين الكائنات"، الصفحة 32.
- ^ perldoc.perl.org: محلي
- ^ perldoc.perl.org: perlsub: القيم المؤقتة عبر local()
- ^ perldoc.perl.org: perlsub: المتغيرات الخاصة عبر my()
- ^ راندال إل. شوارتز وتوم فينيكس (2001-07-01). تعلم لغة بيرل الطبعة الثالثة. أوريلي. الفقرة 4.7. رقم ISBN 0-596-00132-0.
- ^ كونراد إروين. "LSpace: نطاق ديناميكي لروبي". ديسمبر 2012 http://cirw.in/blog/lspace تم الاسترجاع في 2013-10-16.
