Supongamos que tiene un lenguaje de programación con administración de memoria manual. ¿Qué características necesita tener este lenguaje para poder implementar la recolección de basura precisa como una biblioteca, y no como una construcción de lenguaje fundamental?
Por GC preciso me refiero a uno en el que solo se atraviesan punteros al montón para determinar qué variables están o no en vivo.
Algunas consideraciones adicionales:
- C y C ++ tienen el recolector de basura Boehm, pero no cuento esto ya que no es un GC preciso. El recopilador de Boehm supone que cualquier cosa en la pila que pueda ser un puntero, basado únicamente en los requisitos de alineación de memoria, es un puntero. Por ejemplo, cualquier número entero
k
que(k % 4) == 0
parezca un nivel de bit como un puntero, ya que los punteros deben estar alineados en 4 bytes. - Urraca transforma el código C existente para utilizar un recolector de basura preciso. El código C generado tiene muchos apéndices para la recolección de basura, es decir, cosas para registrar cualquier puntero de pila en el montón con el recolector. No cuento esto porque nunca se podría esperar que nadie escriba código de esa manera; Es más un objetivo de compilación para otros idiomas.
Me imagino que ese lenguaje debería tener:
- Macros o alguna forma de metaprogramación, para encapsular todo el código adicional necesario para hacer cosas como registrar raíces GC.
- Algún mecanismo reflexivo que le permite inspeccionar estructuras o uniones; debe determinar qué miembros son punteros.
- Algún mecanismo reflexivo que le permite examinar el diseño del marco de la pila. Esto suena mucho más difícil que 2.
Espero que esto no sea demasiado vago o basado en opiniones, pero me he estado preguntando por un tiempo.