¿Qué significa ‘apilar’ dentro de la programación?

La “pila” es un área de memoria direccionada en serie que la CPU administra de forma parcial y automática para usted. Por “direccionado en serie” aquí, quiero decir que todo lo almacenado en la pila se almacena secuencialmente, sin espacios.

Puede almacenar datos manualmente en la pila (como una pila de platos) para fines temporales. Si lo hace, debe tener mucho cuidado de eliminarlo siempre en el orden inverso de almacenamiento y debe hacer todo lo posible para mantener la pila lo más vacía posible. En cualquier momento, puede agregar una “placa” (byte o palabra) a la “parte superior” de la pila con una simple instrucción PUSH (ensamblador), y en cualquier momento puede quitar la “placa” superior de la pila, pero no puedes quitar ninguna “placa” debajo de ella; solo puedes eliminar la parte superior. Tampoco puede insertar ninguna “placa” en el medio de la pila.

Cada vez que llama a un procedimiento o función, la CPU almacena automáticamente algunos de sus registros, uno a la vez, en la pila, luego “PUSHes” (almacena) su dirección de instrucción actual (más uno) en la pila, luego salta al procedimiento llamado A su regreso, la CPU “POP” es la “placa” superior (que es su próxima dirección de instrucción previa a la llamada) de la pila. Dependiendo del tipo específico de retorno, también puede POP otros registros y realizar una limpieza de pila. Mientras está dentro de ese procedimiento / función, puede crear variables temporales adicionales dentro del espacio de la pila: esas variables tendrán un alcance restringido a ese procedimiento / función y, opcionalmente, a otros procedimientos / funciones que este procedimiento / función llama, pero no extendiéndose a este procedimiento / función de la persona que llama. El espacio de pila más allá del SP actual (puntero de pila) nunca garantiza que contenga nada en particular.

Si trabaja en cualquier idioma de un nivel superior al lenguaje ensamblador, el compilador o el intérprete generalmente manejará todo el uso de la pila por usted … pero si trabaja en un lenguaje de “nivel inferior más alto” como C, a menudo es útil entender la pila .

Si trabaja con un IDE, ese IDE puede exponerle la pila y los registros de la CPU durante una sesión de depuración. Si es así, experimente con él: realice llamadas, cree variables locales, examine sus posiciones en la pila, observe lo que les sucede cuando regresa de una llamada.

Es una pila secuencial de direcciones de retorno, valores guardados y variables locales.

Cuando llama a una subrutina, necesita saber a dónde regresar cuando se hace, por lo que, como mínimo, la dirección de retorno se apila en la pila y se despliega para ejecutar la devolución.

A menudo, los registros de la CPU también se guardan en la pila y se eliminan justo antes del regreso, y las variables locales también pueden colocarse en la pila y descartarse al regresar.

Los parámetros para la subrutina también a menudo se cargan en la pila.

Las pilas son áreas de memoria que forman un búfer LIFO. En muchos sistemas, la pila se encuentra en la parte superior de la memoria y crece hacia cero. (Pero normalmente colisionará con la memoria del programa u otras variables mucho antes de que llegue a cero). Es importante mantener un espacio entre la pila y el otro almacenamiento para que no se sobrescriban entre sí, de lo contrario, su programa podría volver a una dirección sin sentido o las variables podrían contener valores clobbered.

En términos generales, una pila se refiere al conjunto de tecnologías agrupadas en una jerarquía sobre la que descansa su aplicación. El ejemplo más común hoy en día es el Android Stack . Android tiene Linux en su núcleo, y un montón de bibliotecas SDK y un Dalvik Runtime que forman la segunda capa de esta pila (ver más abajo). La tercera capa consiste en el marco de la aplicación compuesto por algunos servicios básicos de Android sobre su aplicación descansará.


Por lo tanto, comprender la pila es muy útil cuando está codificando una aplicación. Por ejemplo, el diagrama de pila anterior le indicará que la pila de Android ya tiene características para bases de datos SSL y SQLite integradas, por lo que no tiene que reinventar esta funcionalidad usted mismo.

Otros ejemplos populares de pilas incluyen:

1. LAMP (Linux, Apache, mysql y PHP)
2. SIGNIFICADO (MongoDB, Expressjs, Angularjs, Nodejs)
3. WAMP (Windows, Apache, mysql y PHP)

Otro uso del término stack en la programación es capas de sistemas o procesos interdependientes. Por ejemplo, la pila “LAMP” para servidores web:

¿Qué es una pila LAMP?

Es una estructura de datos primero en entrar, último en salir. Piensa en un dispensador de monedas. Puede agregar monedas (push) o eliminarlas (pop). No puede acceder a la segunda moneda sin quitar primero la superior. En las computadoras, sus datos en lugar de monedas.

Las pilas resultan muy útiles cuando se trata de subrutinas en ensamblaje, y posteriormente funciona en C para volver a las funciones de llamada o pasar argumentos, etc.

Una pila o pila de llamadas (o pila de activación) es una estructura de datos basada en la pila (primero en entrar, última en salir) utilizada para realizar un seguimiento de las direcciones de retorno después de que finaliza la función actual que se ejecuta. (Para rastrear a la persona que llama, o una jerarquía de personas que llaman). El marco de una función se inserta en la pila en una llamada de función. Está poblada tanto por la persona que llama como por la persona que llama. La persona que llama coloca la dirección de retorno y los parámetros que se pasan a la persona que llama. Y la persona que llama coloca sus propios datos como variables locales. Se mantiene un puntero de pila para apuntar a la parte superior de la pila. Todo el marco de la función se saca de la pila de llamadas una vez que el control sale de la función y la ejecución se devuelve al llamante en función de la dirección de retorno almacenada.

Una pila es una estructura de datos abstracta.
Sigue el principio LIFO (último en entrar, primero en salir).
Por lo tanto, el elemento que se empujará (insertará) por última vez es el primero en extraerse (eliminarse).
Se puede implementar utilizando matrices, así como la Lista vinculada en lenguaje C.
Se prefieren las matrices cuando el número de inserciones y eliminaciones es mínimo.
La lista vinculada es la opción preferible, aunque no se puede someter a búsqueda de acceso aleatorio (búsqueda binaria) ya que los elementos de la lista vinculada solo se pueden acceder de forma secuencial.
Espero que esto haya ayudado 🙂