Explique el concepto de marco de pila en pocas palabras.
Parece que entiendo la idea de la pila de llamadas en el diseño de lenguajes de programación. Pero no puedo encontrar (probablemente, simplemente no busco lo suficiente) ninguna explicación decente de qué es el marco de pila .
Por eso me gustaría pedirle a alguien que me lo explique en pocas palabras.
Un marco de pila es un marco de datos que se inserta en la pila. En el caso de una pila de llamadas, un marco de pila representaría una llamada a una función y sus datos de argumento.
Si no recuerdo mal, la dirección de retorno de la función se inserta primero en la pila, luego los argumentos y el espacio para las variables locales. Juntos, forman el "marco", aunque es probable que esto dependa de la arquitectura. El procesador sabe cuántos bytes hay en cada cuadro y mueve el puntero de la pila en consecuencia a medida que los cuadros se empujan y sacan de la pila.
EDITAR:
Existe una gran diferencia entre la pila de llamadas de nivel superior y la pila de llamadas del procesador.
Cuando hablamos de la pila de llamadas de un procesador, estamos hablando de trabajar con direcciones y valores a nivel de byte/palabra en código ensamblador o de máquina. Hay "pilas de llamadas" cuando se habla de lenguajes de nivel superior, pero son una herramienta de depuración/tiempo de ejecución administrada por el entorno de ejecución para que pueda registrar lo que salió mal con su programa (en un nivel alto). En este nivel, a menudo se conocen cosas como números de línea y nombres de métodos y clases. Cuando el procesador recibe el código, no tiene absolutamente ningún concepto de estas cosas.
Si comprende muy bien la pila, comprenderá cómo funciona la memoria en el programa y si comprende cómo funciona la memoria en el programa, comprenderá cómo se almacena la función en el programa y si comprende cómo se almacena la función en el programa, comprenderá cómo funciona la función recursiva y si Entiendes cómo funciona la función recursiva, entenderás cómo funciona el compilador y, si entiendes cómo funciona el compilador, tu mente funcionará como compilador y depurarás cualquier programa muy fácilmente.
Déjame explicarte cómo funciona la pila:
Primero debes saber cómo se representan las funciones en la pila:
El montón almacena valores asignados dinámicamente.
Stack almacena valores de asignación y eliminación automática.
Entendamos con el ejemplo:
def hello(x):
if x==1:
return "op"
else:
u=1
e=12
s=hello(x-1)
e+=1
print(s)
print(x)
u+=1
return e
hello(4)
Ahora comprenda partes de este programa:
Ahora veamos qué es una pila y cuáles son sus partes:
Asignación de la pila:
Recuerde una cosa: si se cumple la condición de retorno de cualquier función, sin importar si ha cargado las variables locales o no, regresará inmediatamente de la pila con su marco de pila. Significa que siempre que cualquier función recursiva cumpla con la condición base y coloquemos un retorno después de la condición base, la condición base no esperará para cargar las variables locales que se encuentran en la parte "de lo contrario" del programa. Inmediatamente devolverá el fotograma actual de la pila, tras lo cual el siguiente fotograma estará ahora en el registro de activación.
Vea esto en la práctica:
Desasignación del bloque:
Entonces, ahora, cada vez que una función encuentra una declaración de retorno, elimina el marco actual de la pila.
Al regresar de la pila, los valores se devolverán en orden inverso al orden original en el que fueron asignados en la pila.