โทรหางคืออะไร?

ในการเขียนโปรแกรมคอมพิวเตอร์ tail call เป็นสถานการณ์ที่เฉพาะเจาะจงภายในซอร์สโค้ดของโปรแกรมซึ่งฟังก์ชั่น, รูทีนย่อยหรือโพรซีเดอร์ส่งคืนค่าที่คาดไว้โดยการเรียกฟังก์ชันอื่นแทนการส่งตัวแปรที่เก็บค่าส่งคืนเท่านั้น ชื่อตัวเองหมายถึงฟังก์ชั่นที่เรียกว่าการคำนวณค่าที่จะส่งคืนคือที่ส่วนท้ายหรือส่วนท้ายของฟังก์ชั่นที่เรียกมันว่าจะให้ค่าตอบแทน การเรียกหางมีความน่าสนใจสำหรับโปรแกรมเมอร์บางคนเพราะด้วยการปรับให้เหมาะสมหรือพฤติกรรมของคอมไพเลอร์จะไม่มีการใช้พื้นที่สแต็กเพิ่มเติมเพื่อเก็บรหัสตำแหน่งของฟังก์ชั่นหลัก ฟังก์ชั่น tail แทนจะใช้เพื่อสร้างรายงานค่าส่งคืนโดยตรงกลับไปยังจุดโทรที่มีการเรียกใช้ฟังก์ชั่นดั้งเดิม การใช้ tail call มีประโยชน์อย่างยิ่งในสถานการณ์ที่มีการเรียกใช้การสอบถามซ้ำเนื่องจากจำนวนของพื้นที่สแต็กที่ใช้ในการจัดเก็บที่อยู่ของผู้โทรในกรณีที่การเรียกซ้ำแบบเรียกซ้ำสามารถทำได้อย่างรวดเร็วและหยุดการทำงานของโปรแกรม แม้ว่าการใช้การเรียกแบบหางสามารถช่วยเพิ่มความเร็วการใช้หน่วยความจำและประสิทธิภาพในโปรแกรม แต่ยังสามารถนำไปสู่สถานการณ์ที่ซอร์สโค้ดถูกปรับโครงสร้างใหม่เพื่อใช้การโทรในลักษณะที่ทำให้ยากต่อการดีบักและติดตามโดยเฉพาะอย่างยิ่งกรณีของ เรียกซ้ำ

การมีอยู่ของ tail call นั้นส่วนใหญ่จะเป็นวิธีที่ call stack ทำงานภายในโปรแกรมคอมพิวเตอร์และสถาปัตยกรรมระบบส่วนใหญ่ สแต็กซึ่งเป็นเหมือนสแต็กของเพลตเป็นโครงสร้างข้อมูลเข้าก่อนออกก่อน เมื่อมีการเรียกใช้ฟังก์ชันรูทีนย่อยหรือโพรซีเดอร์จะมีการจัดเก็บที่อยู่ที่เรียกใช้ซึ่งเรียกว่าเฟรมสแต็กในสแต็ก นี่หมายถึงโปรแกรมที่เรียกใช้ฟังก์ชั่น A ซึ่งต่อมาเรียกฟังก์ชั่น B จะมีสองสแต็กเฟรมหนึ่งสำหรับฟังก์ชั่น B และอีกอันอยู่ข้างใต้สำหรับฟังก์ชั่น A หลังจาก Function B เสร็จสิ้นการดำเนินการ สแต็คและการดำเนินการกลับไปที่ Function A ซึ่งมีเฟรมของมันโผล่ออกมาจากสแต็กเมื่อเสร็จสิ้นในที่สุดก็กลับการควบคุมโปรแกรมไปยังจุดที่ฟังก์ชั่นแรกที่ถูกเรียกเดิม

เมื่อเรียกใช้ tail คำสั่ง return ในฟังก์ชันจะใช้ค่าส่งคืนของฟังก์ชันอื่นโดยตรงเป็นข้อมูลที่จะส่งไปยังรหัสโทรศัพท์ ในตัวอย่างข้างต้นหากฟังก์ชัน A เรียกใช้ฟังก์ชัน B โดยตรงด้วยคำสั่ง return ดังนั้นจะมีการเรียกใช้ tail ภายใน call stack แทนที่จะมี stack stack frame สำหรับทั้งฟังก์ชั่น A และ B ฟังก์ชั่น B จะได้รับที่อยู่ผู้ส่งคืนจาก Function A และเฟรม A ของ Function A จะถูกตอกและจำหน่ายซึ่งหมายความว่า Function B จะส่งคืนค่าโดยตรง ไปยังตำแหน่งที่เรียกว่าฟังก์ชัน A โดยไม่ต้องผ่านการควบคุมกลับไปที่ฟังก์ชัน A ก่อนซึ่งจะเป็นการเพิ่มความเร็วของการเรียกใช้ฟังก์ชันรวมถึงช่วยลดปริมาณข้อมูลในสแต็ก

คุณสมบัติของการเรียกหางสามารถทำให้พวกเขาเป็นตัวเลือกที่น่าสนใจมากสำหรับฟังก์ชั่นวนซ้ำ ฟังก์ชั่นวนซ้ำเป็นฟังก์ชันที่เรียกตัวเองซ้ำ ๆ เพื่อคำนวณค่าเช่นเดียวกับกรณีเมื่อทำการข้ามโครงสร้างข้อมูลรายการ ไม่มีเฟรมสแต็กเพิ่มเติมถูกสร้างขึ้นสำหรับการเรียกใช้ฟังก์ชันที่ซ้อนกันดังนั้นการเรียกซ้ำระดับลึกมากสามารถดำเนินการได้อย่างปลอดภัยโดยไม่ต้องมีภัยคุกคามจากการโอเวอร์โฟลว์ในทันทีและการยกเลิกโปรแกรมที่เป็นไปได้