Me he topado con un pequeño problema para escribir la gestión de memoria con respecto a la representación interna de tipos en un compilador para lenguajes complejos de tipo estático. Considere un fragmento simple en C++ que demuestre fácilmente un tipo que se refiera a sí mismo.Gestión de memoria para tipos en lenguajes complejos
class X {
void f(const X&) {}
};
Los tipos pueden tener relaciones casi infinitamente complejas entre sí. Entonces, como proceso de compilación, ¿cómo se asegura de que se recopilen correctamente?
Hasta ahora, he decidido que la recolección de basura podría ser el camino correcto, que no sería muy feliz porque quiero escribir el compilador en C++ o, como alternativa, simplemente dejarlos y nunca recopilar durante la vida de la fase de compilación para la que se necesitan (que tiene una vida útil muy fija) y luego recopilarlos todos después. El problema con eso es que si tienes muchos tipos complejos, podrías perder mucha memoria de esa manera.
¿Qué objetos te preocupan exactamente? Tokens? Nodos AST? ¿Cómo se relaciona esto con los lenguajes "complejos" (?) De tipo estático? –
La solución común es agregar varias pasadas a su compilador. Esta es la forma más fácil de hacerlo. El primer pase solo resuelve estos nombres y los vincula, y luego en el próximo pase puede usarse. Dependiendo del idioma, es posible que necesite varias pases para tener todo disponible correctamente. – tp1
@Konrad: la representación interna de un tipo, probablemente sería algo así como una clase llamada Tipo. @ tp1: Eso es para analizar y resolver símbolos ... no para administrar la memoria de los objetos a los que corresponden esos símbolos. – Puppy