متغير عالمي
في برمجة الحاسوب ، المتغير العام هو متغير ذو نطاق عام ، أي أنه مرئي (وبالتالي يمكن الوصول إليه) في جميع أنحاء البرنامج، ما لم يتم حجبه . تُعرف مجموعة جميع المتغيرات العامة بالبيئة العامة أو الحالة العامة. في اللغات المُصرّفة ، تكون المتغيرات العامة عادةً متغيرات ثابتة ، يمتد نطاقها (عمرها) طوال مدة تشغيل البرنامج، بينما في اللغات المُفسّرة (بما في ذلك مُفسّرات سطر الأوامر )، تُخصّص المتغيرات العامة ديناميكيًا عند تعريفها، لأنها غير معروفة مسبقًا.
في بعض لغات البرمجة، تكون جميع المتغيرات عامة، أو عامة افتراضيًا، بينما في معظم اللغات الحديثة، يكون نطاق المتغيرات محدودًا، وعادةً ما يكون نطاقًا معجميًا ، مع أن المتغيرات العامة غالبًا ما تكون متاحة بتعريف متغير في المستوى الأعلى من البرنامج. أما في لغات أخرى، فلا وجود للمتغيرات العامة؛ وهذه عادةً ما تكون لغات برمجة نمطية تفرض بنية نمطية، أو لغات برمجة كائنية التوجه قائمة على الأصناف تفرض بنية صنفية.
يستخدم
تُسمى آليات التفاعل مع المتغيرات العامة بآليات البيئة العامة (انظر أيضًا الحالة العامة ). ويُقارن نموذج البيئة العامة بنموذج البيئة المحلية ، حيث تكون جميع المتغيرات محلية بدون ذاكرة مشتركة (وبالتالي يمكن إعادة توجيه جميع التفاعلات إلى تمرير الرسائل ).
تُستخدم المتغيرات العامة على نطاق واسع لتمرير المعلومات بين أجزاء من التعليمات البرمجية التي لا تربطها علاقة استدعاء/استدعاء، مثل الخيوط المتزامنة ومعالجات الإشارات. اللغات (بما فيها لغة C) التي يُعرّف فيها كل ملف مساحة اسم ضمنية، تُزيل معظم المشاكل التي تُلاحظ في اللغات ذات مساحة الاسم العامة ، مع أن بعض المشاكل قد تستمر في غياب التغليف المناسب. بدون تأمين مناسب (مثل استخدام mutex )، لن تكون التعليمات البرمجية التي تستخدم المتغيرات العامة آمنة للاستخدام في بيئة متعددة الخيوط ، باستثناء القيم للقراءة فقط في الذاكرة المحمية .
عالمي فقط وعالمي افتراضياً
تُوفّر العديد من اللغات غير المهيكلة ، مثل الإصدارات الأولى من لغات BASIC و COBOL و Fortran I (1956)، متغيرات عامة فقط. قدّمت Fortran II (1958) إجراءات فرعية بمتغيرات محلية، والكلمة المفتاحية COMMON للوصول إلى المتغيرات العامة. استمر استخدام COMMON في FORTRAN حتى FORTRAN 77، [ 1 ] وأثّر على لغات لاحقة مثل PL/SQL. تتصرف مجموعات COMMON المُسمّاة للمتغيرات العامة بشكل مشابه لمساحات الأسماء المهيكلة. [ 2 ] تُعتبر المتغيرات عامة افتراضيًا في لغات Forth و Lua و Perl ومعظم أنظمة الصدفة.
حسب اللغة
لغة C ولغة C++
لا تحتوي لغة C على globalكلمة مفتاحية عامة . مع ذلك، تتمتع المتغيرات المُعلنة خارج دالة بنطاق ملف، أي أنها مرئية داخل الملف. وتكون المتغيرات المُعلنة بنطاق ملف مرئية بين تعريفها ونهاية وحدة الترجمة ( .cالملف) (إلا إذا حجبها كائن يحمل نفس الاسم في نطاق أقرب، مثل متغير محلي). ولها ارتباط خارجي ضمنيًا، وبالتالي فهي مرئية ليس فقط للملف .cأو وحدة الترجمة التي تحتوي على تعريفاتها، بل أيضًا لكل وحدة ترجمة أخرى مرتبطة بها لتشكيل البرنامج الكامل. مع ذلك، لا يكفي الارتباط الخارجي لاستخدام هذا المتغير في ملفات أخرى: لكي تتمكن وحدة الترجمة من الوصول إلى هذا المتغير العام بشكل صحيح، ستحتاج إلى معرفة نوعه. ويتم ذلك بتعريف المتغير في كل ملف باستخدام الكلمة externالمفتاحية العامة. (سيتم التصريح عنه في كل ملف، ولكن قد يتم تعريفه في ملف واحد فقط). externغالبًا ما توضع هذه التصريحات في ملف رأس مشترك، حيث جرت العادة أن .cتتضمن جميع ملفات المشروع .hملفًا واحدًا على الأقل: ملف الرأس القياسي errno.hمثال على ذلك، مما يجعل errnoالمتغير متاحًا لجميع الوحدات في المشروع. عندما يُعتبر هذا الوصول العام إشكاليًا، يمكن تعطيله باستخدام الكلمة staticالمفتاحية التي تقيد نطاق المتغير بنطاق الملف، مما سيؤدي إلى ظهور externخطأ في الترجمة (أو الربط) عند محاولة استيراده. [ 3 ]
مثال على متغير "عام" في لغة C :
#include <stdio.h>// هذا متغير نطاق الملف (مع ارتباط داخلي)، مرئي فقط في // وحدة التجميع هذه. static int shared = 3 ;// هذا الملف يحتوي على ارتباط خارجي (لا يقتصر على وحدة التجميع هذه). extern int over_shared ;// أيضًا، الارتباط الخارجي. // المتغيرات العامة التي لا تحتوي على مُحدد فئة تخزين لها ارتباط خارجي في لغة C. int over_shared_too = 2 ;static void changeShared () { // مرجع إلى متغير نطاق الملف في دالة. shared = 5 ; }static void localShadow () { // متغير محلي سيخفي المتغير العام الذي يحمل نفس الاسم. int shared ;// سيؤثر هذا فقط على المتغير المحلي ولن يكون له أي تأثير على // متغير نطاق الملف الذي يحمل نفس الاسم. shared = 1000 ; }static void paramShadow ( int shared ) { // سيؤثر هذا فقط على المعامل ولن يكون له أي تأثير على متغير نطاق الملف الذي يحمل نفس الاسم. shared = - shared ; }int main () { // مرجع إلى متغير نطاق الملف.printf ( "%d \n " , shared );changeShared (); printf ( "%d \n " , shared );localShadow (); printf ( "%d \n " , shared );paramShadow ( 1 ); printf ( "%d \n " , shared );return 0 ; }بما أن المتغير خارجي، فلا حاجة لتمريره كمعامل لاستخدامه في أي دالة أخرى غير الدالة الرئيسية. فهو ينتمي إلى جميع الدوال في الوحدة.
ستكون النتيجة كالتالي:
3 5 5 5
جافا
بعض اللغات، مثل جافا، لا تحتوي على متغيرات عامة. في جافا، جميع المتغيرات غير المحلية هي حقول ضمن فئة. وبالتالي، تقع جميع المتغيرات ضمن نطاق فئة أو دالة. في جافا، توجد الحقول الثابتة (المعروفة أيضًا بمتغيرات الفئة ) بشكل مستقل عن أي نسخة من الفئة، ويتم مشاركة نسخة واحدة منها بين جميع النسخ؛ لذا تُستخدم الحقول الثابتة العامة للعديد من الأغراض نفسها التي تُستخدم فيها المتغيرات العامة في لغات أخرى نظرًا لتشابه آلية "المشاركة" بينهما.
public class Global { public static int a ; }PHP
تحتوي لغة PHPglobal على كلمة مفتاحية وعدد من الطرق غير المألوفة لاستخدام المتغيرات العامة. المتغيرات المُعلنة خارج الدوال يكون نطاقها على مستوى الملف (وهو النطاق الأوسع في معظم الحالات). مع ذلك، لا يمكن الوصول إليها داخل الدوال إلا إذا تم استيرادها باستخدام الكلمة globalالمفتاحية (أي أن الكلمة المفتاحية تصل إلى المتغيرات العامة، ولا تُعلن عنها).
مع ذلك، فإن بعض المتغيرات المُعرَّفة مسبقًا، والمعروفة بالمتغيرات العامة الفائقة، تكون متاحة دائمًا. وهي جميعها عبارة عن مصفوفات. أحد هذه المتغيرات العامة هو المتغير $GLOBALSالعام الفائق، الذي يحتوي على جميع المتغيرات المُعرَّفة خارج نطاق الدالة. تُغيِّر التغييرات التي تُجرى على عناصره المتغيرات الأصلية، وتُنشئ الإضافات متغيرات جديدة. تُستخدم المتغيرات العامة الفائقة على نطاق واسع في برمجة الويب $_POST.$_GET
لغات أخرى
- في لغتي بايثون وماتلاب ، يمكن تعريف متغير عام في أي مكان باستخدام الكلمة
globalالمفتاحية. [ 4 ] [ 5 ] - تتميز المتغيرات العامة في لغة روبي برمز ' ' .
$يوجد عدد من المتغيرات العامة المعرفة مسبقًا، على سبيل المثال هو مُعرّف العملية الحالية .$$
انظر أيضاً
مراجع
- ↑ "برنامج تعليمي لـ Fortran 77" .
- ↑ "الخطوات الأولى: كائنات المكدس والكومة" .
- ↑ C in a Nutshell, P.Prinz & T Crawford, 2006, O'Reilly, الفصل 11
- ↑ "ما هي قواعد المتغيرات المحلية والعامة في بايثون؟" . docs.python.org . مؤسسة برمجيات بايثون . تم الاطلاع عليه بتاريخ 4 يونيو 2020 .
- ↑ "تعريف المتغيرات كمتغيرات عامة" . in.mathworks.com . شركة ماث ووركس . تم الاطلاع عليه بتاريخ 7 فبراير 2015 .
- متغير (علوم الحاسوب)
