متغير ثابت

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

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

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

تاريخ

يعود تاريخ المتغيرات الثابتة على الأقل إلى ALGOL 60 (1960)، حيث تُعرف باسم المتغيرات الخاصة :

يمكن تمييز التصريح باستخدام المُصرِّح الإضافي own. ويترتب على ذلك ما يلي: عند إعادة الدخول إلى الكتلة، ستبقى قيم الكميات own دون تغيير عن قيمها عند الخروج الأخير، بينما تكون قيم المتغيرات المُصرَّح عنها التي لم يتم تمييزها بـ own غير مُعرَّفة.

تقرير منقح بشأن ALGOL 60، القسم "5. الإعلانات"، صفحة 14

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

يعود استخدام كلمة "static" للإشارة إلى هذه المتغيرات إلى لغة BCPL (1966) على الأقل، وقد شاع استخدامها بفضل لغة البرمجة C ، التي تأثرت بشكل كبير بلغة BCPL. وينص تعريف BCPL على ما يلي:

(1) عناصر البيانات الثابتة: هي عناصر البيانات التي يستمر نطاقها طوال مدة تنفيذ البرنامج؛ وتتميز هذه العناصر بقيم L ثابتة ظاهرة. يجب أن يكون كل عنصر بيانات ثابت قد تم تعريفه إما في تعريف دالة أو إجراء، أو في تعريف عام، أو كعلامة محددة بنقطتين رأسيتين.

دليل مرجع مكتبة مقاطعة كولومبيا البريطانية، 7.2 تخصيص المساحة ونطاق عناصر البيانات

لاحظ أن BCPL قد حددت "عنصر بيانات ديناميكي" لما يسمى الآن متغير تلقائي (محلي، مخصص في المكدس)، وليس للكائنات المخصصة في الكومة، وهو الاستخدام الحالي لمصطلح التخصيص الديناميكي .

تُستخدم الكلمة المفتاحية في لغة C واللغات ذات الصلة لكل من المتغيرات الثابتة والمفاهيم الأخرى static.

معالجة

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

نِطَاق

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

مثال

مثال على متغير محلي ثابت في لغة C:

#include <stdio.h>void func () { static int x = 0 ; // يتم تهيئة x مرة واحدة فقط خلال خمس استدعاءات للدالة func()، وسيتم زيادة قيمة المتغير // خمس مرات بعد هذه الاستدعاءات. ستكون القيمة النهائية لـ x // هي 5. x ++ ; printf ( "%d \n " , x ); // إخراج قيمة x }int main () { func (); // يطبع 1 func (); // يطبع 2 func (); // يطبع 3 func (); // يطبع 4 func (); // يطبع 5return 0 ; }

البرمجة الكائنية التوجه

في البرمجة كائنية التوجه ، يوجد أيضًا مفهوم المتغير العضو الثابت ، وهو " متغير فئة " لفئة مُعرَّفة بشكل ثابت، أي متغير عضو لفئة معينة يُشارك بين جميع مثيلاتها (الكائنات)، ويمكن الوصول إليه كمتغير عضو لهذه الكائنات. أما متغير الفئة لفئة مُعرَّفة بشكل ديناميكي، في اللغات التي يُمكن فيها تعريف الفئات أثناء التشغيل، فيتم تخصيصه عند تعريف الفئة ولا يكون ثابتًا. [ 2 ]

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

انظر أيضاً

ملحوظات

  1. جاك رونز. " ما هو تخصيص الذاكرة الثابت وتخصيص الذاكرة الديناميكي؟" . MeritHub [معهد تطوير المسار الوظيفي]. مؤرشف من الأصل في 11 يونيو 2010. تم الاطلاع عليه في 16 يونيو 2011. يقوم المترجم بتخصيص مساحة الذاكرة المطلوبة لمتغير مُعلن. باستخدام عامل العنوان (addressof)، يتم الحصول على العنوان المحجوز، ويمكن إسناد هذا العنوان إلى متغير مؤشر. نظرًا لأن معظم المتغيرات المُعلنة لها ذاكرة ثابتة، تُعرف هذه الطريقة في إسناد قيمة مؤشر إلى متغير مؤشر بتخصيص الذاكرة الثابت. يتم تخصيص الذاكرة أثناء وقت الترجمة.
  2. سميث، مايكل أ. (1993)، "المتغيرات والدوال الثابتة" ، في سميث، مايكل أ. (محرر)، البرمجيات الموجهة للكائنات في لغة C++ ، بوسطن، ماساتشوستس: سبرينغر الولايات المتحدة، ص 89-93 ، doi : 10.1007/978-1-4899-6629-2_7 ، ISBN  978-1-4899-6629-2تم الاطلاع عليه بتاريخ 14 يناير 2026

مراجع