compiler-construction circular-dependency

compiler construction - ¿Cómo funciona la compilación de dependencias circulares?



compiler-construction circular-dependency (2)

Debe tomar un enfoque de 2 pasos o de pasos múltiples :

Los lenguajes como Java requieren un compilador de varias pasadas, ya que la definición de x no se requeriría antes del uso:

public class Example { public static void main(String [] args) { assert(x==0); x++; assert(x==1); } static int x=0; }

Existen varios enfoques, por ejemplo, podría hacer lo siguiente:

El primer pase podría buscar todas las declaraciones de variables, el segundo para las declaraciones de métodos, etc. hasta que el último pase use toda esta información para compilar el código final.

He hecho el ejemplo en Java pero creo (no probado) que funciona en otros (¿todos?) Idiomas.

Tienes 2 archivos. Primero, M.java :

public class MType { XType x; MType() {x = null;} }

En segundo lugar, otro archivo (en el mismo directorio), XType.java :

public class XType { MType m; public XType(MType m) {this.m = m;} }

Ok, es una mala programación, pero si ejecuta javac XType compila: compila incluso MType porque XType necesita. Pero ... MType necesita XType ... ¿cómo funciona eso? ¿Cómo sabe el compilador lo que está sucediendo?

Me gustaría saber cómo el compilador (javac o cualquier otro compilador que conozcas) maneja esa situación, no cómo evitarla.

Pregunto porque estoy escribiendo un precompilador y me gustaría manejar esa situación.


El primer archivo no necesita saber nada sobre XType, excepto que es un tipo, y de manera similar para MType en el segundo archivo. Además, en Java, todos los objetos tienen efectivamente el mismo tamaño (porque todo se accede a través de referencias), por lo que no se necesita el tamaño del objeto. Esto no es así en otros idiomas: su código, tal como está, no se compilaría en C ++, por ejemplo (sintaxis de lenguaje aparte).