Pila de llamadas


En informática , una pila de llamadas es una estructura de datos de pila que almacena información sobre las subrutinas activas de un programa informático . Este tipo de pila también se conoce como pila de ejecución, pila de programa, pila de control, pila de tiempo de ejecución o pila de máquina , y a menudo se abrevia simplemente como " la pila ". Aunque el mantenimiento de la pila de llamadas es importante para el correcto funcionamiento de la mayoría del software , los detalles normalmente están ocultos y son automáticos en los lenguajes de programación de alto nivel . Muchas computadorasLos conjuntos de instrucciones proporcionan instrucciones especiales para manipular pilas.

Una pila de llamadas se usa para varios propósitos relacionados, pero la razón principal para tener una es realizar un seguimiento del punto al que cada subrutina activa debe devolver el control cuando termina de ejecutarse. Una subrutina activa es aquella que ha sido llamada, pero aún debe completar la ejecución, después de lo cual el control debe devolverse al punto de llamada. Dichas activaciones de subrutinas pueden anidarse en cualquier nivel (recursivo como un caso especial), de ahí la estructura de la pila. Por ejemplo, si una subrutina DrawSquarellama a una subrutina DrawLinedesde cuatro lugares diferentes, DrawLinedebe saber a dónde regresar cuando se complete su ejecución. Para lograr esto, la dirección que sigue a la instrucción que salta a DrawLine, la dirección de retorno, se coloca en la parte superior de la pila de llamadas con cada llamada.

Dado que la pila de llamadas está organizada como una pila , la persona que llama inserta la dirección de retorno en la pila y la subrutina llamada, cuando termina, extrae o extrae la dirección de retorno de la pila de llamadas y transfiere el control a esa dirección. Si una subrutina llamada llama a otra subrutina, empujará otra dirección de retorno a la pila de llamadas, y así sucesivamente, con la información apilándose y desapilándose según dicta el programa. Si la inserción consume todo el espacio asignado para la pila de llamadas, se produce un error llamado desbordamiento de pila , que generalmente hace que el programa se bloquee . Agregar la entrada de una subrutina a la pila de llamadas a veces se denomina "bobinado"; por el contrario, eliminar entradas es "desenrollar".

Por lo general, hay exactamente una pila de llamadas asociada con un programa en ejecución (o más exactamente, con cada tarea o subproceso de un proceso ), aunque se pueden crear pilas adicionales para el manejo de señales o la multitarea cooperativa (como con setcontext ). Dado que solo hay uno en este contexto importante, puede denominarse la pila (implícitamente, "de la tarea"); sin embargo, en el lenguaje de programación Forth, se accede a la pila de datos o la pila de parámetros de manera más explícita que a la pila de llamadas y se la conoce comúnmente como la pila (ver más abajo).

En los lenguajes de programación de alto nivel , los detalles de la pila de llamadas generalmente están ocultos para el programador. Se les da acceso solo a un conjunto de funciones, y no a la memoria en la pila en sí. Este es un ejemplo de abstracción . La mayoría de los lenguajes ensambladores , por otro lado, requieren que los programadores participen en la manipulación de la pila. Los detalles reales de la pila en un lenguaje de programación dependen del compilador , el sistema operativo y el conjunto de instrucciones disponible .

Como se indicó anteriormente, el propósito principal de una pila de llamadas es almacenar las direcciones de retorno . Cuando se llama a una subrutina, la ubicación (dirección) de la instrucción en la que la rutina de llamada puede reanudarse más tarde debe guardarse en algún lugar. El uso de una pila para guardar la dirección de retorno tiene importantes ventajas sobre las convenciones de llamadas alternativas . Una es que cada tarea puede tener su propia pila y, por lo tanto, la subrutina puede ser segura para subprocesos , es decir, puede estar activa simultáneamente para diferentes tareas que hacen cosas diferentes. Otro beneficio es que al proporcionar reentrada , recursividadse admite automáticamente. Cuando una función se llama a sí misma recursivamente, se debe almacenar una dirección de retorno para cada activación de la función para que luego pueda usarse para regresar desde la activación de la función. Las estructuras de pila proporcionan esta capacidad automáticamente.


Diseño de pila de llamadas para pilas de crecimiento ascendente