إعلان (برمجة الحاسوب)
في برمجة الحاسوب ، يُعدّ التصريح في بنية اللغة النحوية عملية تحديد خصائص المعرّف لتهيئته : فهو يُصرّح بمعنى الكلمة (المعرّف). [1] تُستخدم التصريحات عادةً للدوال والمتغيرات والثوابت والفئات ، ولكن يمكن استخدامها أيضًا لكيانات أخرى مثل التعدادات وتعريفات الأنواع. [ 1 ] بالإضافة إلى الاسم (المعرّف نفسه) ونوع الكيان (دالة، متغير، إلخ)، تُحدّد التصريحات عادةً نوع البيانات (للمتغيرات والثوابت)، أو توقيع النوع (للدوال)؛ وقد تتضمن الأنواع أيضًا أبعادًا، كما هو الحال في المصفوفات . يُستخدم التصريح لإعلام المُصرّف بوجود الكيان ؛ وهذا مهم في اللغات ذات الأنواع القوية التي تتطلب تحديد الدوال والمتغيرات والثوابت وأنواعها بتصريح قبل استخدامها، ويُستخدم في التصريح المُسبق . [ 2 ] غالبًا ما يتم مقارنة مصطلح "الإعلان" بمصطلح "التعريف"، [ 1 ] ولكن المعنى والاستخدام يختلفان اختلافًا كبيرًا بين اللغات؛ انظر أدناه.
تُعدّ التصريحات بارزةً بشكلٍ خاص في لغات البرمجة التي تنتمي إلى تقليد ALGOL ، بما في ذلك عائلة BCPL ، وأبرزها لغتا C و C++ ، بالإضافة إلى لغة باسكال . تستخدم لغة جافا مصطلح "التصريح"، مع أنها لا تشترط وجود تصريحات وتعريفات منفصلة.
الإعلان مقابل التعريف
يتمثل أحد الفروق الأساسية في ما إذا كان التصريح يتضمن تعريفًا أم لا: على سبيل المثال، هل يُحدد تصريح المتغير أو الثابت قيمته ، أم نوعه فقط؟ وبالمثل، هل يُحدد تصريح الدالة جسمها ( تنفيذها )، أم توقيع نوعها فقط؟ [ 1 ] لا تُفرّق جميع اللغات بين هذين المفهومين: ففي كثير من اللغات، يتضمن التصريح دائمًا تعريفًا، وقد يُشار إليه إما بـ"التصريحات" أو "التعريفات"، حسب اللغة. [ أ ] ومع ذلك، يتم التمييز بين هذين المفهومين في اللغات التي تتطلب التصريح قبل الاستخدام (والتي تُستخدم فيها التصريحات المسبقة)، وفي اللغات التي تفصل بين الواجهة والتنفيذ: فالواجهة تحتوي على التصريحات، والتنفيذ يحتوي على التعريفات. [ ب ]
في الاستخدام غير الرسمي، يشير مصطلح "التصريح" إلى التصريح المجرد (أنواع فقط، بدون قيمة أو جسم)، بينما يشير مصطلح "التعريف" إلى التصريح الذي يتضمن قيمة أو جسمًا. مع ذلك، في الاستخدام الرسمي (في مواصفات اللغة)، يشمل مصطلح "التصريح" كلا المعنيين، مع وجود فروق أدق بين اللغات: في لغتي C وC++، يُطلق على تصريح الدالة الذي لا يتضمن جسمًا اسم " نموذج الدالة الأولي "، بينما يُطلق على تصريح الدالة الذي يتضمن جسمًا اسم "تعريف الدالة". في لغة Java، تظهر التصريحات في شكلين. بالنسبة للطرق العامة، يمكن تمثيلها في الواجهات كتوقيعات طرق، والتي تتكون من أسماء الطرق وأنواع المدخلات ونوع المخرجات. يمكن استخدام ترميز مشابه في تعريف الطرق المجردة ، التي لا تحتوي على تعريف. يمكن إنشاء مثيل للفئة المُحيطة، ولكن يلزم إنشاء فئة مشتقة جديدة، تُقدم تعريف الطريقة، لإنشاء مثيل للفئة . بدءًا من Java 8 ، أُضيفت تعبيرات لامدا إلى اللغة، والتي يمكن اعتبارها تصريح دالة.
الإعلانات والتعاريف
في عائلة لغات البرمجة C، تُجمع التصريحات عادةً في ملفات رأسية ، تُضمّن بدورها في ملفات مصدرية أخرى تُشير إلى هذه التصريحات وتستخدمها، ولكنها لا تملك حق الوصول إلى تعريفها. تُوفّر المعلومات الموجودة في الملف الرأسي واجهةً بين الشيفرة التي تستخدم التصريح وتلك التي تُعرّفه، وهو شكل من أشكال إخفاء المعلومات . يُستخدم التصريح غالبًا للوصول إلى الدوال أو المتغيرات المُعرّفة في ملفات مصدرية مختلفة، أو في مكتبة . يُؤدي عدم تطابق نوع التعريف مع نوع التصريح إلى ظهور خطأ في المُصرّف.
بالنسبة للمتغيرات، تُسند التعريفات قيمًا إلى مساحة من الذاكرة تم حجزها أثناء مرحلة الإعلان. أما بالنسبة للدوال، فتُحدد التعريفات جسم الدالة. مع أن المتغير أو الدالة قد يُعلن عنها عدة مرات، إلا أنها تُعرّف عادةً مرة واحدة فقط (في لغة C++ ، يُعرف هذا بقاعدة التعريف الواحد أو ODR).
تسمح اللغات الديناميكية مثل JavaScript أو Python عمومًا بإعادة تعريف الدوال، أي إعادة ربطها ؛ الدالة هي متغير يشبه أي متغير آخر، له اسم وقيمة (التعريف).
فيما يلي بعض الأمثلة على التصريحات التي لا تُعد تعريفات، في لغة C:
extern char example1 ; extern int example2 ; void example3 ( void );فيما يلي بعض الأمثلة على التصريحات التي هي عبارة عن تعريفات، مرة أخرى بلغة C:
char example1 ; /* خارج تعريف الدالة، سيتم تهيئته إلى الصفر. */ int example2 = 5 ; void example3 ( void ) { /* التعريف بين الأقواس */ }متغيرات غير معرّفة
في بعض لغات البرمجة، يُعرَّف المتغير ضمنيًا عند أول استخدام له أثناء الترجمة . أما في لغات أخرى، فيُعتبر هذا الاستخدام خطأً، وقد يُؤدي إلى ظهور رسالة تشخيصية. بدأت بعض اللغات بسلوك التعريف الضمني، ولكن مع تطورها، أتاحت خيارًا لتعطيله (مثل " " في لغة بيرلuse strict أو " " في لغة فيجوال بيسكOption Explicit ).
انظر أيضاً
ملحوظات
- ↑ على سبيل المثال، تستخدم لغة جافا "التصريح" (تصريح الفئة، تصريح الأسلوب)، بينما تستخدم لغة بايثون "التعريف" (تعريف الفئة، تعريف الدالة). [ 3 ]
- ↑ يتم ملاحظة هذا التمييز في "وحدات" باسكال (الوحدات النمطية)، وفي تنظيم التعليمات البرمجية التقليدية C و C++، والتي تحتوي على ملفات رأسية تتكون إلى حد كبير من إعلانات بحتة، وملفات مصدرية تتكون من تعريفات، على الرغم من أن هذا لا يتم الالتزام به دائمًا بدقة، ولا يتم فرضه من قبل اللغة.
مراجع
- 1 2 3 4 "يحدد الإعلان تفسير وخصائص مجموعة من المعرفات. تعريف المعرف هو إعلان لهذا المعرف يتضمن ما يلي:
- بالنسبة لكائن [متغير أو ثابت]، يتسبب ذلك في حجز مساحة تخزين لهذا الكائن؛
- بالنسبة للدالة، يشمل ذلك جسم الدالة؛
- بالنسبة لثابت التعداد، يكون هذا هو الإعلان (الوحيد) للمعرف؛
- بالنسبة لاسم تعريف النوع، يكون هذا هو الإعلان الأول (أو الوحيد) للمعرف.
- ↑ مايك باناهان. "2.5. تعريف المتغيرات" . GBdirect . تم الاسترجاع في 2011-06-08 .
[أ] تعريف [...] يُعرّف فقط اسم ونوع شيء ما ولكنه لا يُخصص أي مساحة تخزين [...].
- ↑ 7. العبارات المركبة ، مرجع لغة بايثون
روابط خارجية
- الفرق بين التصريح والتعريف في لغتي C و C++ ، بقلم أليكس ألين
- 8.2. الإعلانات والتعاريف وإمكانية الوصول ، كتاب C، GBdirect
- التصريحات والتعريفات (C++) ، MSDN
- "تُخبر التصريحات المُترجم بوجود عنصر أو اسم في البرنامج. وتُحدد التعريفات ما هو الكود أو البيانات التي يصفها الاسم."
- مفاهيم لغة البرمجة
