متغير تلقائي

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

تُطبَّق المتغيرات المحلية التلقائية بشكل أساسي على لغات البرمجة ذات النطاق المعجمي التكراري . [ ملاحظة 2 ] تُخصَّص المتغيرات المحلية التلقائية عادةً في إطار مكدس الإجراء الذي تُصرَّح فيه. [ ملاحظة 3 ] وقد تم ذلك في الأصل لتحقيق إمكانية إعادة الدخول والسماح بالتكرار ، [ ملاحظة 4 ] وهو اعتبار لا يزال قائمًا حتى اليوم. عُرِض مفهوم المتغيرات التلقائية في الدوال التكرارية (والمتداخلة ) في لغة ذات نطاق معجمي على نطاق أوسع مع لغة ALGOL في أواخر الخمسينيات، وازداد انتشاره بفضل العديد من اللغات اللاحقة لها.

عادةً ما يكون مصطلح المتغير المحلي مرادفًا للمتغير التلقائي، حيث أنهما نفس الشيء في العديد من لغات البرمجة، لكن المحلي أكثر عمومية - معظم المتغيرات المحلية هي متغيرات محلية تلقائية، ولكن توجد أيضًا متغيرات محلية ثابتة ، لا سيما في لغة C. بالنسبة للمتغير المحلي الثابت، يكون التخصيص ثابتًا (عمره هو تنفيذ البرنامج بأكمله)، وليس تلقائيًا، ولكنه يكون ضمن النطاق فقط أثناء تنفيذ الدالة.

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

لغة C، لغة C++

في لغتي C و C++ (قبل C++11)، autoتسمى المتغيرات المعلنة باستخدام المتغيرات التلقائية .

جميع المتغيرات المُعلنة ضمن كتلة برمجية تكون تلقائية افتراضيًا. المتغير التلقائي غير المُهيأ له قيمة غير مُعرّفة إلى أن تُسند إليه قيمة صالحة من نوعه. [ 1 ] يمكن إضافة مُحدد فئة التخزين autoإلى هذه المُعلنات أيضًا، ولكن نظرًا لأنها جميعًا تلقائية افتراضيًا، فإن هذا الأمر زائد عن الحاجة ونادرًا ما يُستخدم.

في لغة C، يُعد استخدام فئة التخزين registerبمثابة تلميح للمترجم لتخزين المتغير مؤقتًا في سجل المعالج. وباستثناء عدم السماح &باستخدام عامل عنوان المتغير ( ) على المتغير أو أي من مكوناته الفرعية، فإن للمترجم حرية تجاهل هذا التلميح. [ 2 ]

في لغة C++ ، يتم استدعاء مُنشئ المتغيرات التلقائية عند وصول التنفيذ إلى موضع تعريفها. أما مُدمّرها فيتم استدعاؤه عند الوصول إلى نهاية كتلة البرنامج المُحددة (تُحاط كتل البرنامج بأقواس معقوفة). تُستخدم هذه الخاصية غالبًا لإدارة تخصيص الموارد وتحريرها، مثل فتح الملفات ثم إغلاقها تلقائيًا أو تحرير الذاكرة، وهو ما يُعرف باسم " استحواذ الموارد هو التهيئة " (RAII).

منذ إصدار C++11، يسمح C++ بتعريف المتغيرات باستخدام autoمُحدِّد النوع، [ 3 ] ولكن هذا يعني أن نوع المتغير يُستنتج ، ولا يشير إلى نطاق المتغير. وقد اعتمدت لغة C استنتاج النوع autoلمُحدِّد النوع بدءًا من C23 .

جافا

في لغة جافا، تسمى المتغيرات التلقائية بالمتغيرات المحلية .

يشبه Java لغتي C و C++، لكنه لا يستخدم الكلمة المفتاحية `input` autoأو ` registerinput`. مع ذلك، لن يسمح مُصرّف Java باستخدام متغير محلي غير مُهيأ صراحةً، وسيُظهر خطأً في التجميع (على عكس C و C++ حيث يُظهر المُصرّف عادةً تحذيرًا فقط). يُلزم معيار Java بتهيئة كل متغير محلي صراحةً قبل استخدامه. [ 4 ] يختلف هذا عن متغيرات النسخة، التي تُهيأ ضمنيًا بقيم افتراضية (وهي0للأرقام وباطل(للأشياء).

بيرل

في لغة بيرل، تسمى المتغيرات التلقائية بالمتغيرات المعجمية أو المتغيرات الخاصة .

في لغة بيرل، تُعلن المتغيرات المحلية باستخدام myالمعامل `--`. ستكون قيمة المتغيرات العددية غير المُهيأة هي `--` undef؛ أما المصفوفات أو الجداول التجزئية غير المُهيأة فستكون قيمتها ` ()--`. [ 5 ]

يحتوي بيرل أيضًا على localمُعامل لا يُنشئ متغيرات تلقائية، [ 6 ] بل يُعطي المتغيرات العامة (متغيرات الحزمة) قيمة مؤقتة، يتم تحديد نطاقها ديناميكيًا ضمن الكتلة المُحيطة. عند الخروج من نطاق المتغير، تُستعاد قيمته القديمة.

انظر أيضاً

ملحوظات

  1. إلا إذا كانت دالة متداخلة ، والتي يتم تعريفها بدورها على طول تلك البيانات المحلية
  2. على الرغم من وجودها بشكل مشابه إلى حد ما، ولكن ليس متطابقًا، أيضًا في اللغات التكرارية ذات النطاق الديناميكي ، مثل الإصدارات القديمة من لغة LISP
  3. ما لم يُنص على خلاف ذلك، مثل البيانات الثابتة أو البيانات المستندة إلى الكومة، والتي يمكن تحديدها في بعض اللغات
  4. عند استخدام خاصية إعادة الدخول للروتين، سواء للتكرار أو غير ذلك،يجب ألا يحاول المحسن تخصيص مثل هذه المتغيرات في سجلات المعالج (من أجل الكفاءة) لأن هذا من شأنه أن يكسر خاصية إعادة الدخول.

مراجع

  1. التيار"المعيار C" (ملف PDF) . (3.61 ميجابايت )  : القسم 6.2.4، مدة تخزين الكائنات
  2. "مدة التخزين" ، cppreference.com
  3. "محددات نوع العنصر النائب" ، cppreference.com
  4. "4.12.5 القيم الأولية للمتغيرات" . صن مايكروسيستمز . تم الاطلاع عليه بتاريخ 17-10-2008 .
  5. "المتغيرات الخاصة عبر my() - perlsub - perldoc.perl.org" . تم الاطلاع عليه بتاريخ 17-10-2008 .
  6. "القيم المؤقتة عبر الدالة المحلية () - perlsub - perldoc.perl.org" . تم الاطلاع عليه بتاريخ 25-02-2011 .