توقيع النوع

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

أمثلة

لغة C/C++

في لغتي C و C++ ، يُعلن عن توقيع النوع بما يُعرف عادةً بنموذج الدالة . في C/C++، يعكس تعريف الدالة استخدامها ؛ على سبيل المثال، يُستدعى مؤشر الدالة ذو التوقيع كما يلي:(int)(char,double)

char c ; double d ; int retVal = ( * fPtr )( c , d );

إرلانغ

في لغة إرلانج ، يمكن تعريف توقيعات الأنواع بشكل اختياري، على النحو التالي: [ 1 ]

- spec function_name ( type1 (), type2 (), ...) -> out_type ().

على سبيل المثال:

- spec is_even ( number ()) -> boolean ().

هاسكل

عادةً ما يكون توقيع النوع في لغة هاسكل بالشكل التالي:

اسم الدالة :: نوع الوسيط 1 -> نوع الوسيط 2 -> ... -> نوع الوسيط N

لاحظ أن نوع النتيجة يُمكن اعتباره كل شيء بعد الوسيط الأول المُمرَّر. هذا نتيجة لعملية التخصيص الجزئي (currying) ، التي يُتيحها دعم لغة هاسكل للدوال من الدرجة الأولى ؛ تتطلب هذه الدالة مُدخلين، حيث يُمرَّر وسيط واحد، ثم تُخصَّص لها دالة مُخصَّصة للوسيط الآخر. بالتالي، استدعاء الدالة ، حيث ، يُنتج دالة جديدة يُمكن استدعاؤها لإنتاج .fxf::a->b->cf2::b->cf2bc

يمكن أن تتضمن مواصفات النوع الفعلية نوعًا فعليًا، مثل ، أو متغير نوعInteger عام يُستخدم في الدوال متعددة الأشكال ذات المعاملات ، مثل ، أو ، أو . لذا يمكننا كتابة شيء مثل: abanyTypefunctionName::a->a->...->a

بما أن لغة هاسكل تدعم الدوال ذات الرتبة العليا ، فإنه يمكن تمرير الدوال كوسائط. ويكتب هذا على النحو التالي: functionName::(a->a)->a

تأخذ هذه الدالة دالة ذات توقيع نوع وتعيد بيانات من النوع out.a->aa

جافا

في آلة جافا الافتراضية ، يتم استخدام توقيعات الأنواع الداخلية لتحديد الطرق والفئات على مستوى كود الآلة الافتراضية.

مثال: يتم تمثيل الطريقة في رمز البايت على النحو التالي :StringString.substring(int,int)Ljava/lang/String.substring(II)Ljava/lang/String;

تبدو توقيعات الطريقة mainعلى النحو التالي: [ 2 ]

public static void main ( String [] args );

وفي الشفرة البايتية المفككة، تأخذ شكلLsome/package/Main/main:([Ljava/lang/String;)V

يحتوي توقيع الطريقة main()على ثلاثة مُعدِّلات:

  • publicيشير ذلك إلى أنه يمكن استدعاء الطريقة بواسطة أي كائن.main()
  • staticيشير ذلك إلى أن الطريقة هي طريقة فئة.main()
  • voidيشير هذا إلى أن الطريقة ليس لها قيمة إرجاع.main()

إمضاء

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

يُعد فهم مفهوم توقيع الدالة مفهومًا مهمًا لجميع دراسات علوم الحاسوب.

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

في لغة البرمجة C ، يكون التوقيع مكافئًا تقريبًا لتعريف النموذج الأولي الخاص به .

في عائلة لغات البرمجة ML ، يتم استخدام "signature" ككلمة رئيسية تشير إلى بنية نظام الوحدات التي تلعب دور الواجهة .

توقيع الطريقة

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

أمثلة

ج

في لغة C، يكون توقيع الطريقة هو اسم الطريقة وعدد ونوع معلماتها، ولكن من الممكن أن يكون هناك معلمات متغيرة ، ولكن هذه ليست آمنة من حيث النوع.

int printf ( const char * fmt , ...);

يمكن إجراء التلاعب بهذه المعلمات باستخدام الإجراءات الموجودة في رأس المكتبة القياسية <stdarg.h>.

لغة سي++

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

في حالة استخدام القوالب المتغيرة :

void doSomething ( auto && ... args );

ملاحظة تعادل .voiddoSomething(auto...args);template<typename...Ts>voiddoSomething(Ts...args);

سي شارب

على غرار بناء جملة لغة C، تتكون توقيعات الأساليب في لغة C# من اسم وعدد ونوع معلمات هذه الطريقة، حيث قد تكون المعلمة الأخيرة عبارة عن مصفوفة من القيم: [ 5 ]

void Add ( out int sum , params int [] value ); [...] Add ( out sum , 3 , 5 , 7 , 11 , - 1 ); // sum == 25

جافا

في لغة جافا ، يتكون توقيع الدالة من اسمها وعدد ونوع وترتيب معاملاتها. لا تُعتبر أنواع القيم المُعادة والاستثناءات المُثارة جزءًا من توقيع الدالة، ولا أسماء المعاملات؛ إذ يتجاهلها المُصرّف عند التحقق من تفرد الدالة.

تساعد توقيعات الدوال في التمييز بين الدوال المُحمّلة (الدوال التي تحمل نفس الاسم) في الصنف. لا تُعتبر أنواع الإرجاع جزءًا من التحميل الزائد. يجب استخدام توقيعات الدوال فقط للتمييز بين الدوال المُحمّلة. [ 6 ]

على سبيل المثال، الطريقتان التاليتان لهما توقيعات مختلفة:

void doSomething ( String [] x ); // doSomething(String[]) void doSomething ( String x ); // doSomething(String)

الطريقتان التاليتان لهما نفس التوقيع:

دالة `doSomething ( int x ); ` // دالة `doSomething(int)` دالة `doSomething ( int y )` تُطلق استثناءً // دالة `doSomething(int)`

تُمثَّل المعاملات المتغيرة في لغة جافا بعلامة الحذف (...) على المعامل الأخير. وتتصرف هذه المعاملات تمامًا مثل المصفوفة، ولكن في بايت كود JVM، يُشار إلى الدالة بعلامة "متغيرة".

void doSomething ( String ... x ); // مكافئ لـ doSomething(String[])

جوليا

في لغة جوليا ، تأخذ توقيعات الدوال الشكل التالي:

العمولة ( بيع :: عدد صحيح ، معدل :: عدد عشري 64 بت ) :: عدد عشري 64 بت

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

يُسمح باستخدام الأنواع المجردة، بل ويُشجع عليها، لتطبيق سلوك عام مشترك بين جميع الأنواع الفرعية. لذا، يمكن إعادة كتابة الدالة المذكورة أعلاه على النحو التالي. في هذه الحالة، يمكن للدالة قبول أي نوع فرعي من نوعي Integer و Real.

العمولة ( البيع :: عدد صحيح ، المعدل :: عدد حقيقي ) :: عدد حقيقي

تُعدّ أنواع الوسائط في الدوال اختيارية تمامًا. وعند عدم تحديدها، يُعادل ذلك استخدام النوع Any، وهو النوع الأساسي لجميع الأنواع. ومن المتعارف عليه تحديد أنواع الوسائط دون تحديد نوع القيمة المُعادة.

أوبجكتيف سي

في لغة البرمجة Objective-C ، يتم تعريف توقيعات الدوال للكائن في ملف رأس الواجهة . على سبيل المثال،

- ( id ) initWithInt: ( int ) value ;

يُعرّف هذا الأسلوب initWithIntدالة تُعيد كائنًا عامًا (كائنًا من نوع `<object>` id) وتأخذ وسيطًا واحدًا من نوع عدد صحيح. لا يتطلب Objective-C تحديد نوع الكائن صراحةً في التوقيع إلا إذا لم يكن من نوع `<object>` id؛ وهذا التوقيع مكافئ له:

- initWithInt: ( int ) value ;

الصدأ

في لغة Rust ، تأخذ توقيعات الدوال الشكل التالي:

fn commission ( sale : u32 , rate : f64 ) -> f64 ;

انظر أيضاً

مراجع

  1. "دليل مستخدم Erlang المرجعي، الإصدار 13.1.4" . erlang.org . 7.5 مواصفات الدوال. مؤرشف من الأصل بتاريخ 27 يناير 2023. تم الاطلاع عليه بتاريخ 27 أبريل 2023 .
  2. "التوقيع (الدوال) - مسرد مصطلحات MDN Web Docs: تعريفات المصطلحات المتعلقة بالويب | MDN" . developer.mozilla.org . 2023-06-08 . تم الاطلاع عليه بتاريخ 2024-07-05 .
  3. "مرجع لغة C++: مصطلحات البرمجة" . تم الاطلاع عليه بتاريخ 3 ديسمبر 2013 .
  4. بول ليهي. "توقيع الدالة" . دليل About.com . تاريخ الاسترجاع: 31 مايو 2011. توقيع الدالة هو جزء من تعريف الدالة، وهو عبارة عن اسم الدالة وقائمة المعاملات.
  5. ^ موسنبوك ، هانسبيتر (2002-03-25). ""C# المتقدم: عدد متغير من المعلمات"" (PDF) . معهد برمجيات النظم، جامعة يوهانس كيبلر لينز، Fachbereich Informatik. ص. 52 . تم الاسترجاع 2011/08/03 . 
  6. "الفصل 4. تنسيق ملف الفئة" . docs.oracle.com . تم الاطلاع عليه بتاريخ 17-10-2021 .