ما هو Tail Call؟

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

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

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

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