2011-07-06 18 views
10

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.

+1

¿Qué objetos te preocupan exactamente? Tokens? Nodos AST? ¿Cómo se relaciona esto con los lenguajes "complejos" (?) De tipo estático? –

+0

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

+0

@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

Respuesta

1

La gestión de la memoria es fácil, solo tiene alguna tabla tipo-nombre -> tipo-descriptor para cada ámbito de declaración. Los tipos se identifican de forma única por nombre, sin importar cuán complejo sea el anidamiento. Incluso un tipo recursivo sigue siendo solo un tipo único. Como tp1 dice correctamente, normalmente realiza múltiples pases para completar todos los espacios en blanco. Por ejemplo, puede verificar que se conoce un nombre de tipo en la primera pasada y luego calcular todos los enlaces, más adelante, calcula el tipo.

Tenga en cuenta que los lenguajes como C no tienen un sistema de tipos realmente complejo, aunque tienen punteros (que permiten tipos recursivos), no hay mucho cálculo de tipo en curso.

+0

En mi idioma, muchos tipos no tendrán nombre ni lugar en el espacio de nombres global. – Puppy

+0

@DeadMG: solo podría generar un nombre único, p. '# AnonStruct15'. No hay forma de referirse al tipo anónimo por nombre de todos modos, por lo que debería ser seguro. – kennytm

+0

@DeadMG si tiene void main() { List<string> MyList = new List<string>(), la variable "MiLista" es un tipo anónimo interno, tal vez con un ID generado automáticamente. por tu compilador – umlcat

1

Creo que se puede quitar los ciclos de la gráfica de dependencia mediante el uso de objetos separados para representar declaraciones y definiciones . Suponiendo un sistema de tipo similar a C++, a continuación, tendrá una dependencia jerárquica:

  • Función definiciones dependen del tipo de definiciones y función declaraciones
  • Tipo definiciones dependen de la función y el tipo declaraciones (y definiciones de tipos contenidos)
  • Función declaraciones dependen del tipo de declaraciones

En su ejemplo, el gráfico de la dependencia es f_def -> X_def -> f_decl -> X_decl.

Sin ciclos en el gráfico, puede administrar objetos utilizando el recuento de referencias simple.

+0

El problema es la segunda línea. Las definiciones de tipo dependen de las definiciones de tipo. 'clase X {std :: vector my_x_vector; }; ' – Puppy

+0

@DeadMG: ¿Depende de la definición de' X' o de la declaración de 'X'? –

+0

Si la instanciación de la plantilla necesita la definición de 'X', entonces el código está mal formado, ya que' X' está incompleto en ese punto. 'vector' solo requiere una declaración de' X', por lo que no hay problema. –

Cuestiones relacionadas