¿Hay una necesidad de recolección de basura en un lenguaje basado en pila?

16

¿Cuál es la necesidad de recolección de basura (GC) en un lenguaje basado en pila? En un lenguaje como Forth o RPL (en calculadoras HP ), ¿hay necesidad de recolectar basura?

Creo que, dado que la salida se saca de la pila, no habría ninguna necesidad. ¿Me estoy perdiendo de algo?

Todd Moses
fuente

Respuestas:

14

GC se aplica normalmente a la memoria asignada en el montón. No estoy familiarizado con Forth o RPL, pero si no hay un montón, y todo está almacenado en una pila global, entonces no hay nada que GC pueda hacer.

Mike Baranczak
fuente
2
El patrón típico de uso de memoria de los programas de Forth que leí en los primeros días era que eran como programas de ensamblaje, en el sentido de que usaban direcciones de datos globales estáticas previamente organizadas. Esto funciona porque Forth tiene la capacidad de transferir datos entre la pila y direcciones específicas. Además tiene la capacidad de calcular direcciones. Por lo tanto, sería posible crear una biblioteca de asignación basada en un concepto de montón y la biblioteca de asignación necesitaría alguna forma de lidiar con el tamaño finito del montón. Si un usuario de Forth tomara este camino, posiblemente podría querer e implementar GC.
Cardiff Space Man
13

Sí tienes razón. Pero la base de la pila es solo una parte de toda la historia. Por ejemplo, el intérprete de código de bytes de Java también se basa en la pila (el código compilado funciona, por razones de eficiencia, de manera diferente). Esto nos dice que cualquier idioma puede transformarse en un idioma de pila.

Lo que importa son los objetos fuera de la pila, aquellos que pueden sobrevivir a la ejecución del método actual. Mientras el lenguaje no tenga nada parecido a malloco new, no hay tales objetos y no necesita deleteni GC.

Un lenguaje que carece de asignación dinámica de memoria es bastante limitado en su utilidad.

maaartinus
fuente
No estoy seguro de estar de acuerdo con la última línea, ¿el código de bytes de Java no es útil?
jk.
@jk., Java bytecode tiene asignación de memoria dinámica.
Peter Taylor
1
En realidad, hay varios lenguajes de uso general que se basan en la pila. Echa un vistazo a factorcode.org
Yam Marcovic
1
En realidad, el factor es la recolección de basura
Andrea
1

La recolección de basura es necesaria si el lenguaje va a soportar estructuras de datos dinámicos inherentemente. Lo cual es casi una necesidad si quieres hacer algo más allá del nivel de C. Sin eso, estás atascado solo con estructuras de datos de tamaño fijo y administrando la memoria tú mismo. Eso es lo que hace Forth original, por supuesto, pero probablemente no sea algo que quiera hacer hoy a menos que solo esté haciendo codificación de sistemas de bajo nivel.

trans
fuente
1

La recolección de basura no es necesaria si el lenguaje usa asignación estática en lugar de la asignación de pila. Por ejemplo, Fortran 77 con la opción -s (almacenamiento estático) asigna toda la memoria cuando se inicia el programa, por lo tanto, no se produce ninguna asignación de memoria en tiempo de ejecución para liberarla. Si bien se necesita cierta disciplina, es posible escribir programas, especialmente simulaciones para usar la asignación de memoria estática. La asignación estática elimina cualquier pérdida de memoria y conduce a un excelente rendimiento de la memoria caché, ya que el compilador puede usar análisis estático para determinar qué cargar en la memoria caché.

Michael Shopsin
fuente