2010-06-13 4 views
15

J'ai fait l'exemple en Java mais je pense (pas testé) que cela fonctionne dans d'autres (tous?) Langues.Comment fonctionne la compilation des dépendances circulaires?

Vous avez 2 fichiers. Tout d'abord, M.java:

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

En second lieu, un autre fichier (dans le même répertoire), XType.java:

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

Ok c'est une mauvaise programmation, mais si vous exécutez javac XType il compile: compile même MType parce que XType besoins il. Mais ... MType a besoin de XType ... comment ça marche? Comment le compilateur sait-il ce qui se passe?

Je voudrais savoir comment le compilateur (javac ou tout autre compilateur que vous connaissez) gère cette situation, pas comment l'éviter.

Je demande parce que j'écris un précompilateur et je voudrais gérer cette situation.

Répondre

4

Vous devez prendre 2 passes, ou multi-pass approche:

langages comme Java ont besoin d'un compilateur multi-passe puisque la définition de x ne serait pas nécessaire de venir avant l'utilisation:

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

Il existe différentes approches, par exemple, vous pouvez effectuer les opérations suivantes:

la première passe pourrait chercher tous variabl e déclarations, la seconde pour les déclarations de méthodes, etc. jusqu'à la dernière passe utilise toutes ces informations pour compiler le code final.

+0

Alors quand il compile le deuxième fichier le compilateur sait déjà ce que le premier est? –

+1

@Fabio - Chaque passage du compilateur traite tous les fichiers regroupant les informations nécessaires au passage suivant. – ChrisF

4

Le premier fichier n'a pas besoin de connaître quoi que ce soit à propos de XType, sauf qu'il s'agit d'un type, et de même pour MType dans le second fichier. De plus, en Java, tous les objets sont effectivement de la même taille (parce que tout est accessible via des références), donc la taille de l'objet n'est pas nécessaire. Ce n'est pas le cas dans d'autres langages - votre code tel qu'il est ne serait pas compilé en C++, par exemple (syntaxe de langue à part).

+2

mais si vous utilisez une méthode de XType? Il doit savoir les méthodes de Xtype .. non? –

+0

aussi, je ne suis pas sûr de ce que vous voulez dire par "tous les objets sont effectivement de la même taille". – asgs

+1

Il fait référence au fait que (m) contient une référence et que toutes les références ont la même taille. Mais ce n'est pas la seule information requise sur un type. Il est également nécessaire de connaître ses membres et beaucoup d'informations sur sa hiérarchie super-type. –

Questions connexes