¿Qué es una llamada de cola?

En programación informática, una llamada de cola es una situación específica dentro del código fuente del programa en la que una función, subrutina o procedimiento devuelve un valor esperado llamando a otra función en lugar de simplemente pasar una variable que contiene el valor de retorno. El nombre en sí denota que la función llamada para calcular el valor que se devolverá está al final, o al final, de la función que la llama para proporcionar un valor de retorno. Una llamada de cola es de interés para algunos programadores porque, con ciertas optimizaciones o comportamientos del compilador, no se usa espacio de pila adicional para almacenar ubicaciones de código de la función principal; en su lugar, la función de cola se utiliza para generar los informes de valor de retorno directamente al punto de llamada donde se invocó la función original. El uso de una llamada de cola es particularmente útil en situaciones en las que se emplea la recursividad, porque la cantidad de espacio de pila utilizado para almacenar las direcciones de las personas que llaman en los casos en los que las llamadas recursivas se anidan muy profundamente podría agotarse rápidamente y detener la ejecución del programa. Aunque el uso de llamadas finales puede ayudar a aumentar la velocidad, el uso de la memoria y la eficiencia en un programa, también puede conducir a situaciones en las que el código fuente se reestructura para usar las llamadas de una manera que dificulta la depuración y el seguimiento, especialmente en casos de recursividad.

La existencia de una llamada de cola se debe en gran parte a cómo funciona la pila de llamadas dentro de la mayoría de los programas informáticos y arquitecturas de sistemas. La pila, que es como una pila de platos, es una estructura de datos de primero en entrar, último en salir. Cuando se llama a una función, subrutina o procedimiento, la dirección desde la que se realiza la llamada, llamada marco de pila, se almacena en la pila. Esto significa que un programa que llama a la función A, que luego llama a la función B, tendrá dos marcos de pila, uno para la función B y otro debajo para la función A. Una vez que la función B termine de ejecutarse, su marco de pila se extrae de la parte superior del la pila y la ejecución regresa a la Función A, que tiene su marco salido de la pila cuando termina, finalmente devolviendo el control del programa al punto desde el cual se llamó originalmente la primera función.

Cuando se usa una llamada de cola, la declaración de retorno en una función usa directamente el valor de retorno de otra función como los datos que se enviarán al código de llamada. En el ejemplo anterior, si la función A llama a la función B directamente con la declaración de retorno, se ha formado una llamada final. Dentro de la pila de llamadas, en lugar de tener un marco de pila para las funciones A y B, la función B recibirá la dirección de retorno de la función A y el marco de pila de la función A se extraerá y eliminará, lo que significa que la función B pasará su valor de retorno directamente de regreso a la ubicación que llamó a la Función A sin tener primero que pasar el control de vuelta a la Función A. Esto aumenta la velocidad de las llamadas a la función y también ayuda a mantener baja la cantidad de información en la pila.

Las propiedades de una llamada de cola pueden convertirla en una opción muy atractiva para funciones recursivas. Una función recursiva es aquella que se llama a sí misma repetidamente para calcular un valor, como puede ser el caso cuando se recorre una estructura de datos de lista. No se crean marcos de pila adicionales para las llamadas de función anidadas, por lo que se pueden realizar niveles muy profundos de recursividad de forma segura sin la amenaza inmediata de un desbordamiento de pila y una posible terminación del programa.