Skip to main content

Cuộc gọi đuôi là gì?

Trong lập trình máy tính, cuộc gọi đuôi là một tình huống cụ thể trong mã nguồn chương trình trong đó hàm, chương trình con hoặc thủ tục trả về giá trị dự kiến bằng cách gọi một hàm khác thay vì chỉ cần chuyển một biến giữ giá trị trả về.Bản thân tên biểu thị rằng hàm được gọi để tính giá trị được trả về ở cuối hoặc đuôi, của hàm gọi nó để cung cấp giá trị trả về.Một cuộc gọi đuôi được một số lập trình viên quan tâm bởi vì, với các hành vi tối ưu hóa hoặc trình biên dịch nhất định, không có không gian ngăn xếp bổ sung được sử dụng để lưu trữ các vị trí mã của hàm chính;Thay vào đó, hàm đuôi được sử dụng để tạo các báo cáo giá trị trả về trực tiếp trở lại điểm gọi nơi hàm gốc được gọi.Việc sử dụng một cuộc gọi đuôi đặc biệt hữu ích trong các tình huống được sử dụng đệ quy, bởi vì lượng không gian ngăn xếp được sử dụng để lưu trữ các địa chỉ người gọi trong các trường hợp các cuộc gọi đệ quy Nest rất sâu có thể nhanh chóng hết và dừng thực thi chương trình.Mặc dù sử dụng các cuộc gọi đuôi có thể giúp tăng tốc độ, việc sử dụng bộ nhớ và hiệu quả trong một chương trình, nhưng nó cũng có thể dẫn đến các tình huống trong đó mã nguồn được cơ cấu lại để sử dụng các cuộc gọi theo cách gây khó khăn cho việc gỡ lỗi và theo dõiđệ quy.

Sự tồn tại của một cuộc gọi đuôi phần lớn là do cách thức hoạt động trong hầu hết các chương trình máy tính và kiến trúc hệ thống.Ngăn xếp, giống như một chồng các tấm, là cấu trúc dữ liệu đầu tiên, cuối cùng.Khi một hàm, chương trình con hoặc thủ tục được gọi, địa chỉ mà cuộc gọi được thực hiện, được gọi là khung ngăn xếp, được lưu trữ trong ngăn xếp.Điều này có nghĩa là một chương trình gọi hàm A, sau đó gọi hàm B, sẽ có hai khung ngăn xếp, một cho hàm B và một hàm khác bên dưới chức năng A. Sau khi chức năng B được thực thi, khung ngăn xếp của nó được bật từ đầuStack và thực thi trở lại chức năng A, có khung hình bật ra khỏi ngăn xếp khi nó được thực hiện, cuối cùng sẽ trả lại điều khiển chương trình về điểm mà hàm đầu tiên được gọi ban đầu.Một hàm trực tiếp sử dụng giá trị trả về của hàm khác làm dữ liệu sẽ được gửi đến mã gọi.Trong ví dụ trên, nếu hàm A hàm gọi B trực tiếp với câu lệnh trả về, thì một cuộc gọi đuôi đã được hình thành.Trong ngăn xếp cuộc gọi, thay vì có khung ngăn xếp cho cả hai hàm A và B, hàm B sẽ nhận địa chỉ trả lại từ hàm ngăn xếp của hàm A và hàm ađến vị trí được gọi là hàm A mà không phải chuyển kiểm soát trở lại chức năng A. Điều này làm tăng tốc độ của các cuộc gọi chức năng cũng như giúp giảm lượng thông tin trong ngăn xếp.Chúng là một lựa chọn rất hấp dẫn cho các chức năng đệ quy.Một hàm đệ quy là một hàm tự gọi nhiều lần để tính toán một giá trị, như có thể là trường hợp khi đi qua cấu trúc dữ liệu danh sách.Không có khung ngăn xếp bổ sung nào được tạo cho các cuộc gọi chức năng lồng nhau, do đó, các mức độ đệ quy rất sâu có thể được thực hiện một cách an toàn mà không cần mối đe dọa ngay lập tức của một lần tràn ngăn xếp và kết thúc chương trình có thể.