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 una pila de ejecución , pila del programa , pila de control , pila de tiempo de ejecución , o la pila de la máquina , y es a menudo acortado a simplemente " 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 se ha llamado, pero aún no se ha completado la ejecución, después de lo cual el control debe devolverse al punto de llamada. Tales 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 dónde regresar cuando se complete su ejecución. Para lograr esto, la dirección siguiendo 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 empuja la dirección de retorno a la pila, y la subrutina llamada, cuando termina, saca o saca 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, enviará otra dirección de retorno a la pila de llamadas, y así sucesivamente, con la información acumulada y desapilada según lo 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"; a la inversa, eliminar entradas es "deshacerse".

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, se puede denominar la pila (implícitamente, "de la tarea"); Sin embargo, en el lenguaje de programación Forth la pila de datos o la pila de parámetros se accede más explícita que la pila de llamadas y se 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 al programador. Se les da acceso solo a un conjunto de funciones, y no a la memoria en la propia pila. Este es un ejemplo de abstracción . La mayoría de los lenguajes ensambladores , por otro lado, requieren que los programadores se involucren 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 disponibles .

Como se señaló 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 posteriormente debe guardarse en algún lugar. El uso de una pila para guardar la dirección de retorno tiene ventajas importantes 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 haciendo cosas diferentes. Otro beneficio es que al proporcionar reentrada , recursividades compatible automáticamente. Cuando una función se llama a sí misma de forma recursiva, se debe almacenar una dirección de retorno para cada activación de la función, de modo que luego se pueda usar para regresar de la activación de la función. Las estructuras apiladas proporcionan esta capacidad automáticamente.


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