اصطلاح الاستدعاء

من ويكيبيديا، الموسوعة الحرة

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

الاختلافات[عدل]

قد تختلف اصطلاحات الاستدعاء في:

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

تباين المحول البرمجي[عدل]

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

تباين اسلوب البناء[عدل]

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

بنية إكس 86 (32 بت)[عدل]

يتم استخدام بنية x86 مع العديد من اصطلاحات الاستدعاء المختلفة. ونظرًا لقلة عدد السجلات البنوية، فإن اصطلاحات استدعاء بنية x86 تمرر معظم الوسائط على المكدس، بينما يتم تمرير قيمة الإرجاع (أو المؤشر إليها) إلى السجل.

تستخدم بعض الاصطلاحات سجلات للمعلمات القليلة الأولى، مما قد يحسن من أداء العمليات القصيرة والبسيطة التي يتم استدعاؤها بشكل متكرر (أي الروتينات التي لا تستدعي إجراءات روتينية).

مثال عن الاستدعاء:

 push EAX            ; pass some register result
 push byte[EBP+20]   ; pass some memory variable (FASM/TASM syntax)
 push 3              ; pass some constant
 call calc           ; the returned result is now in EAX

هيكل نموذجي للمستدعى: (من الممكن تحسين بعض أو كل التعليمات أدناه في إجراءات بسيطة)

calc:
  push EBP            ; save old frame pointer
  mov EBP,ESP         ; get new frame pointer
  sub ESP,localsize   ; reserve stack space for locals
  .
  .                   ; perform calculations, leave result in EAX
  .
  mov ESP,EBP         ; free space for locals
  pop EBP             ; restore old frame pointer
  ret paramsize       ; free parameter space and return

بنية إيه آر إم (32 بت)[عدل]

اصطلاحات استدعاء بنية إيه آر إم (32 بت) القياسية تخصص 15 سجلا للأغراض العامة مثل:

  • r14 وهو سجل الارتباط.
  • r13 هو مؤشر المكدس.
  • r12 هو النقطة الصفرية لإجراء الاستدعاء الداخلي.
  • r4 إلى r11: تستخدم لعقد المتغيرات المحلية.
  • r0 إلى r3: يستخدم للاحتفاظ بقيم الوسيط أو الوسائط التي تم تمريرها إلى الروتين الفرعي، ويعقد النتائج التي تم إرجاعها من الروتين فرعي.
  • r15، هو عداد البرنامج.

إذا كان نوع القيمة التي يتم إرجاعها كبيرا جدًا بحيث لا يمكن احتواؤها في r0 إلى r3، أو من النوع الذي لا يمكن تحديد حجمه بشكل ثابت وقت التحويل البرمجي، فيجب على المتصل تخصيص مساحة لتلك القيمة في وقت التشغيل، وتمرير مؤشر إلى تلك المساحة في السجل r0.

يجب أن تحافظ الروتينات الفرعية على محتويات r4 إلى r11 ومؤشر المكدس.على وجه الخصوص، يجب أن تقوم الروتينات الفرعية التي تستدعي روتينات فرعية أخرى بحفظ عنوان الإرجاع في سجل الارتباط r14 إلى المكدس قبل استدعاء تلك الروتينات الفرعية الأخرى. ومع ذلك، لا تحتاج هذه الروتينات الفرعية إلى إرجاع هذه القيمة إلى r14 - فهي تحتاج فقط إلى تحميل تلك القيمة إلى سجل r15 (عداد البرنامج) للعودة.

يلزم اصطلاح استدعاء بنية إيه آر إم باستخدام مكدس تنازلي كامل. , وكما يؤدي اصطلاح الاستدعاء للروتين الفرعي في بنية إيه آر إم القياسية إلى:

  • في المقدمة: دفع r4 إلى r11 إلى المكدس، ودفع عنوان الإرجاع في r14 إلى المكدس
  • نسخ أي وسيطات تم تمريرها (في r0 إلى r3) إلى سجلات النقطة الصفرية المحلية (r4 إلى r11)
  • تخصيص متغيرات محلية أخرى لسجلات النقط الصفرية المحلية المتبقية (r4 إلى r11)
  • القيام بالعمليات الحسابية واستدعاء الروتينات الفرعية الأخرى حسب الضرورة باستخدام BL، على افتراض أن r0 إلى r3 و r12 و r14 لن يتم الاحتفاظ بها
  • وضع النتيجة في r0؛
  • في الخاتمة، سحب r4 إلى r11 من المكدس، وسحب عنوان الإرجاع إلى عداد البرنامج r15.

بنية إيه آر إم (64 بت)[عدل]

اصطلاح استدعاء بنية إيه آر إم (64 بت) يخصص 31 سجلا للأغراض العامة مثل:

  • x30 هو سجل الارتباط (يستخدم للعودة من الروتينات الفرعية)
  • x29 هو سجل الإطار
  • يتم حفظ x19 إلى x29
  • x18 هو "سجل النظام الأساسي"، المستخدم في بعض الأغراض الخاصة لنظام التشغيل، أو سجل إضافي محفوظ للمتصل
  • x16 وx17 هي النقطة الصفرية الداخلية لاصطلاح الاستدعاء
  • x9 إلى x15: يستخدم لعقد المتغيرات المحلية (تم حفظ المتصل)
  • x8: يستخدم للاحتفاظ بعنوان قيمة الإرجاع غير المباشر
  • x0 إلى x7: تستخدم للاحتفاظ بقيم الوسيط أو الوسائط التي تم تمريرها إلى الروتين الفرعي، وأيضًا للاحتفاظ بالنتائج التي تم إرجاعها من الروتين الفرعي

يتم الرجوع إلى السجل الثاني والثلاثين، الذي يعمل كمؤشر مكدس أو كسجل صفر يُحسب السياق، إما كـ sp أو xzr. جميع السجلات التي تبدأ بـ x لها سجل 32 بت مطابق ومثبت مسبقا بـ w. وبهذا يسمى x32 بت ب w0.

بنية باور بي سي[عدل]

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

مجموعة تعليمات ميبس[عدل]

اصطلاح الاستدعاء الأكثر استخداماً لـ ب

نية ميبس 32 بت هو واجهة التطبيق الثنائية O32 التي تمرر الوسائط الأربعة الأولى إلى دالة في السجلات $a0-$a3; وكما يتم تمرير الوسيطات اللاحقة على المكدس.

بنية سبارك[عدل]

تم بناء بنية سبارك بالاعتماد على نوافذ التسجيل على عكس معظم بنيات RISC.

بنية نظام آي بي إم 360[عدل]

بنية نظام آي بي إم 360 هي بنية أخرى بدون مكدس أجهزة.

بنية سوبر إتش[عدل]

السجل ويندوز CE 5.0 gcc Renesas
R0 إرجاع القيم المؤقتة لتوسيع الإرشادات الزائفة للتجميع من المصدر/الوجهة الضمنية لعمليات 8/16 بت.

لا يتم حفظها.

قيمة الإرجاع، يحفظ المصدر المتغيرات/البيانات المؤقتة. غير مضمونة
R1..R3 بمثابة سجلات مؤقتة.

لا يتم حفظها.

النقاط الصفرية المحفوظة للمصدر. عنوان البنية (حفظ المصدر، افتراضيًا) المتغيرات/البيانات المؤقتة. غير مضمونة
R4..R7 أول أربع كلمات من وسيطات العدد الصحيح. توفر منطقة بناء الوسيطة مساحة قد تتسرب فيها R4 خلال R7.

لا يتم حفظها.

يمرر المعلمات، يحفظ المصدر المتغيرات غير مضمونة
R8..R13 بمثابة سجلات دائمة.

يتم حفظها.

يحفظ المصدر المتغيرات/البيانات المؤقتة. مضمونة
R14 مؤشر الإطار الافتراضي. (R8-R13 قد تكون أيضا بمثابة مؤشر إطار وإجرائية قد تستخدم R1-R3 كمؤشر إطار.)

يتم حفظها.

مؤشر الإطار، يحفظ المصدر المتغيرات/البيانات المؤقتة. مضمونة
R15 يعمل كمؤشر مكدس أو كسجل دائم.

يتم حفظها.

مؤشر المكدس، يحفظ المصدر مؤشر المكدس مضمون

بنية 68 كي[عدل]

اصطلاحات الاستدعاء الأكثر شيوعا لسلسلة موتورولا 68000 هي:

  • d0، d1، a0 و a1 هي سجلات النقطة الصفرية
  • جميع السجلات الأخرى محفوظة من قبل المصدر
  • a6 هو مؤشر الإطار، والذي يمكن تعطيله بواسطة المحول البرمجي
  • يتم دفع المعلمات على المكدس، من اليمين إلى اليسار
  • يتم تخزين قيمة الإرجاع في d0

بنية آي بي إم 1130[عدل]

آي بي إم 1130عبارة عن جهاز 16 بت صغير يحوي ستة سجلات فقط بالإضافة إلى مؤشرات الشروط، ولا يحتوي على مكدس.

اعتبارات التنفيذ[عدل]

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

التعليمات البرمجية المترابطة[عدل]

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

لغة البرمجة 1[عدل]

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

انظر أيضا[عدل]

مراجع[عدل]

  1. ^ "معلومات عن اصطلاح الاستدعاء على موقع zhihu.com". zhihu.com. مؤرشف من الأصل في 2022-03-17.

روابط خارجية[عدل]