مُؤهِّل النوع
في سياق لغات البرمجة، يُعدّ مُحدِّد النوع كلمةً مفتاحيةً تُستخدم لتمييز نوعٍ ما، وذلك لتوجيه المُصرِّف للتعامل مع هذا النوع المُحدَّد بطريقةٍ خاصة. [ 1 ] [ 2 ]
حسب اللغة
لغة C/C++
اعتبارًا من عام 2025بالإضافة إلى C23 ، توجد خمسة مُحدِّدات للأنواع في لغة C القياسية: const( C89 )، constexpr( C23 )، volatile( C89 )، restrict( C99 )، و _Atomic( C11 ) - ويُطلق على الأخير اسم خاص لتجنب التعارض مع الأسماء المُعرَّفة من قِبل المستخدم. [ 3 ] أول اثنين من هذه المُحدِّدات، constوهما `cv` و` volatilev`، موجودان أيضًا في لغة C++، وهما مُحدِّدا الأنواع الوحيدان فيها. لذا، في لغة C++، يُستخدم مصطلح " النوع المُؤهَّل بـ cv " (اختصارًا لـ const و volatile ) غالبًا للدلالة على "النوع المُؤهَّل"، بينما يُستخدم مصطلحا " النوع المُؤهَّل بـ c " و" النوع المُؤهَّل بـ v " عندما يكون أحد المُحدِّدات فقط هو المُناسب. تحتوي لغة C++ على المُحدِّدين `cv` constevalو`v` constinit، وهما غير موجودين في لغة C.
من بين هذه المحددات، constيُعدّ المحدد الأكثر شهرةً واستخدامًا، إذ يظهر في المكتبات القياسية للغتين C وC++ ، ويُصادف استخدامه في أي تطبيقٍ هام لهاتين اللغتين، والذي يجب أن يستوفي شرط صحة الثوابت . أما المحددات الأخرى فتُستخدم في البرمجة منخفضة المستوى، ورغم شيوع استخدامها هناك، إلا أنها نادرًا ما تُستخدم من قِبل المبرمجين العاديين. مع ذلك، volatileفقد استُخدم المحدد لفترةٍ من الزمن من قِبل بعض مبرمجي C++ للمزامنة أثناء تعدد الخيوط، على الرغم من أن هذا الاستخدام لم يكن مُستحبًا، وهو الآن غير مُفعّل في معظم المُترجمات.
د
في لغة D، مُنشئات الأنواع هي const`<T> immutable` sharedو`<T>` و`<T> inout`. immutable`<T>` هو شكل أقوى من `<T>` const، حيث يشير إلى بيانات لا يمكن تغيير قيمتها أبدًاconst ، بينما يشير `<T>` إلى بيانات لا يمكن تغييرها من خلال هذا المرجع: إنه عرض ثابت لبيانات قابلة للتغيير. sharedيُستخدم `<T>` للبيانات المشتركة في تعدد الخيوط (كما volatileاستُخدم لفترة وجيزة لـ `<T>` في لغة C++). ` inout<T>` هو حرف بدل يُستخدم للسماح للدوال التي لا تُعدّل البيانات (وبالتالي تهتم فقط بالنوع غير المؤهل للبيانات) بإرجاع نفس النوع المؤهل للمدخلات. constويمكن immutableأيضًا استخدام `<T>` و`<T>` كمحددات لفئة التخزين.
بناء الجملة
في لغتي C و C++، يُحدد نوع البيانات في تعريف الدالة أو تعريف المتغير من خلال تحديد مُحدد نوع واحد أو أكثر، بالإضافة إلى مُؤهِّلات النوع (اختياريًا). على سبيل المثال، يمكن تعريف متغير عدد صحيح كما يلي:
int x ;أين intمُحدِّد النوع؟ يمكن تعريف متغير عدد صحيح غير مُوقَّع على النحو التالي:
عدد صحيح غير مُوقّع x ;حيث يمثل كل من unsignedو intمحددات النوع. يمكن تعريف متغير عدد صحيح غير مُوقّع ثابت على النحو التالي:
const unsigned int x ;حيث constيكون مُؤهِّل النوع، والذي يكون نوعه المؤهل xهو const unsigned intوالنوع غير المؤهل هو unsigned int.
تتضمن تعريفات المتغيرات أيضًا مُحددًا اختياريًا لفئة التخزين . وهذا في الواقع موضوع منفصل، يختلف عن النوع، مع أن constتعريف المتغير له أيضًا آثار على فئة التخزين، أي أنه يمكن تخزينه في ذاكرة للقراءة فقط .
تصحيح متقلب
يشير المحدد الآخر في لغتي C و C++، volatileإلى أنه يمكن تغيير كائن ما بواسطة شيء خارجي عن البرنامج في أي وقت، وبالتالي يجب إعادة قراءته من الذاكرة في كل مرة يتم الوصول إليه.
يُستخدم المُؤهِّل غالبًا في الشيفرة التي تتعامل مع الأجهزة مباشرةً (كما هو الحال في الأنظمة المُدمجة وبرامج تشغيل الأجهزة ) وفي التطبيقات متعددة الخيوط (مع أنه يُستخدم أحيانًا بشكل خاطئ في هذا السياق؛ انظر الروابط الخارجية في volatile variable ). يُمكن استخدامه بنفس طريقة استخدامه constفي تعريفات المتغيرات والمؤشرات والمراجع والدوال الأعضاء، بل volatileويُستخدم أحيانًا لتطبيق استراتيجية تصميم مماثلة تعتمد على العقود، والتي يُطلق عليها أندريه ألكسندرسكوvolatile اسم "الصحة" [ 4 ] ، مع أن هذا أقل شيوعًا بكثير من const"الصحة". volatileكما يُمكن حذف المُؤهِّل بواسطة const_cast، ويُمكن دمجه مع constالمُؤهِّل كما في هذا المثال:
// إنشاء مرجع إلى سجل أجهزة للقراءة فقط // مُخزّن في موقع ذاكرة مُبرمج مسبقًا. const volatile int & hardwareRegister = * reinterpret_cast < int *> ( 0x8000 );int currentValue = hardwareRegister ; // قراءة موقع الذاكرة int newValue = hardwareRegister ; // قراءته مرة أخرىhardwareRegister = 5 ; // خطأ، لا يمكن الكتابة إلى موقع ثابتبسبب hardwareRegisterذلك volatile، لا يوجد ضمان بأن قيمة السجل ستبقى ثابتة عند قراءتين متتاليتين، حتى وإن لم يتمكن المبرمج من تعديلها. تشير الدلالة هنا إلى أن قيمة السجل للقراءة فقط، ولكنها ليست بالضرورة ثابتة.
تاريخ
تم تقديم مفهوم مُؤهِّل النوع، إلى جانب مثال readonly(الذي أُعيدت تسميته لاحقًا const)، بواسطة بيارن ستروستروب في مذكرة فنية داخلية لمختبرات بيل عام 1981، [ 5 ] وتم تنفيذه في لغة C باستخدام Classes ، وهي اللغة السابقة للغة C++ . [ 6 ] أما عن الدافع، فقد كتب ستروستروب: [ 6 ]
- "لقد خدمت وظيفتين: كوسيلة لتعريف ثابت رمزي يلتزم بقواعد النطاق والنوع (أي بدون استخدام ماكرو) وكطريقة لاعتبار كائن في الذاكرة غير قابل للتغيير."
constثم اعتُمدت في لغة C كجزء من التوحيد القياسي، وظهرت في C89 (والإصدارات اللاحقة) إلى جانب مُؤهِّل نوع آخر، ، volatileوالذي ابتكرته لجنة معيار ANSI C (X3J11). [ 7 ]volatile ظهر بحلول عام 1985؛ [ 8 ] وكان من أوائل استخداماته تجميع نواة UNIX لمعالج MIPS ، للسماح بالتجميع المُحسَّن عن طريق منع تطبيق التحسينات المعتادة على المتغيرات المتقلبة. [ 9 ] اقتُرح مُؤهِّل آخر، noalias، في اجتماع لجنة X3J11 في ديسمبر 1987، لكنه رُفض؛ وتحقق هدفه في النهاية من خلال restrictالمُؤهِّل في C99. كان الدافع وراء ، noaliasمكملاً لـ volatile، أي أنه يشير إلى أنه يمكن إجراء حتى التحسينات غير الآمنة عادةً. لم يكن ريتشي مؤيدًا بشدة لمُؤهِّلات النوع، بحجة أنها لا "تؤدي دورها المطلوب"، لكنه في النهاية لم يُطالب بإزالتها من المعيار؛ [ 10 ] لكنه عارض noaliasذلك، وتم إسقاطه من المسودة.
لا تحتوي لغة جافا على مُحدِّدات للأنواع، وقد تم إغفالها بشكل واضح const: فقد رُفض اقتراح عام 1999 لإضافتها، لا سيما لأن إضافتها لاحقًا ثم تغيير المكتبة القياسية لاستخدامها بشكل متسق كان سيؤدي إلى كسر التوافق. [ 11 ] ومع ذلك، تركت جافا في البداية إمكانية تنفيذ مُحدِّدات الأنواع مفتوحة const، وهو ما يُلاحظ من خلال كونها constكلمة محجوزة ، على الرغم من أنها لا تُستخدم فعليًا ككلمة رئيسية . بدلاً من ذلك، تحتوي جافا على الكلمة الرئيسية للأنواع الكائنية final، والتي تُستخدم لتحديد السمات (وبالتالي أيضًا المتغيرات المحلية) كثوابت، ولكن ليس لتحديد الأنواع.
البدائل
تتبنى لغات برمجة أخرى نهجًا مختلفًا، إذ تعتبر الثبات خاصيةً للمُعرِّف ( أو ربط الاسم )، وليس للنوع. وبالتالي، تحتوي هذه اللغات على مُعرِّفات ثابتة (تُقابل "متغيرات" لا تتغير) مع إسناد واحد، لكنها لا تملك مفهومًا لصحة الثبات: بما أن الثبات ليس جزءًا من النوع، فلا مجال لعدم تطابق الأنواع. ومن الأمثلة على ذلك لغة Ada 83 مع الكائنات الثابتة والكلمة constantالمفتاحية [ 12 ] [ a ] ، ولغة Java مع finalالكلمة المفتاحية.
ملحوظات
- ↑ يُطلق معيار Ada على هذا اسم " كلمة محجوزة "؛ انظر تلك المقالة للاطلاع على الاستخدام.
مراجع
- ↑ "محددات النوع" . developer.arm.com . مطور Arm . تم الاطلاع عليه بتاريخ 25 ديسمبر 2024 .
- ↑ "محددات النوع (وثائق XL C لنظام AIX)" . www.ibm.com . شركة IBM. 22 مارس 2018. تاريخ الاسترجاع: 25 ديسمبر 2024 .
- ↑ C11: معيار C الجديد ، توماس بلام
- ↑ "Generic<Programming>: volatile — أفضل صديق لمبرمجي تعدد الخيوط: صحة المتغيرات المتقلبة أو كيفية جعل المترجم يكتشف حالات التزامن نيابةً عنك" بقلم أندريه ألكسندرسكو في مجلة مستخدمي C/C++، منتدى خبراء C++
- ↑ بيارن ستروستروب ، "امتدادات مفهوم نوع لغة C."، مذكرة فنية داخلية لمختبرات بيل، 5 يناير 1981.
- 1 2 التنافس بين الأشقاء: لغتا C و C++ ، بيارن ستروستروب ، 2002، ص 5
- ↑ دينيس م. ريتشي ، " تطوير لغة C" رابط قديم مؤرشف 2015-01-10 على archive.today ، 2003: "قدمت X3J11 أيضًا مجموعة من الإضافات والتعديلات الصغيرة، على سبيل المثال، محددات النوع const و volatile ، وقواعد ترقية النوع المختلفة قليلاً."
- ↑ يظهر هذا في ملاحظات المحاضرة الفنية التي ألقاها مايك باناهان في اجتماع مجموعة مستخدمي أنظمة يونكس الأوروبية (EUUC) بعنوان "مسودة معيار ANSI للغة البرمجة C"، بتاريخ 13 سبتمبر 1985، كما نُشرت في نشرة مجموعة مستخدمي أنظمة يونكس الأسترالية (AUUGN)، المجلد 6، العدد 6، ص 73
- ↑ جون ماشي (16 أغسطس 1991). "ردًا على: RISC مقابل CISC؟ هل نسمي الأشياء بمسمياتها؟" . مجموعة الأخبار : comp.arch . يوزنت: 7037@spim.mips.COM .
- ↑ دعوني أبدأ بالقول إنني لست مقتنعًا بأن حتى المحددات التي كانت سائدة قبل ديسمبر ('const' و'volatile') تؤدي الغرض منها؛ أظن أن ما تضيفه إلى تكلفة تعلم اللغة واستخدامها لا يُعوَّض بزيادة في التعبير. 'volatile' تحديدًا، هي مجرد إضافة غير ضرورية للتطبيقات المتخصصة، ويمكن التعبير عنها بشكل أفضل بوسائل أخرى. ميزتها الرئيسية هي أن الجميع تقريبًا يمكنهم تجاهلها. أما 'const' فهي في الوقت نفسه أكثر فائدة وأكثر وضوحًا؛ لا يمكنك تجنب تعلمها، نظرًا لوجودها في واجهة المكتبة. مع ذلك، لا أدعو إلى استئصال المحددات، ولو فقط لأنه قد فات الأوان.
- ↑ JDK-4211070: يجب أن تدعم لغة جافا المعاملات الثابتة (مثل لغة C++) لصيانة الكود [ sic ]
- ↑ 1815A ، 3.2.1. تعريفات الكائنات : "يُعتبر الكائن المُعلن عنه ثابتًا إذا ظهرت الكلمة المحجوزة constant في تعريف الكائن؛ ويجب أن يتضمن التعريف حينها تهيئة صريحة. لا يمكن تعديل قيمة الثابت بعد التهيئة. تُعتبر المعاملات الرسمية لوضع الإدخال في البرامج الفرعية والمدخلات، والمعاملات الرسمية العامة لوضع الإدخال، ثوابت أيضًا؛ كما يُعتبر مُعامل الحلقة ثابتًا داخل الحلقة المقابلة؛ ويُعتبر المكون الفرعي أو شريحة الثابت ثابتًا."
روابط خارجية
- لغة البرمجة سي
- لغة سي++
