2010-06-13 3 views
15

Ich habe das Beispiel in Java gemacht, aber ich denke (nicht getestet), dass es in anderen (allen?) Sprachen funktioniert.Wie funktioniert das Kompilieren zirkulärer Abhängigkeiten?

Sie haben 2 Dateien. Zuerst M.java:

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

Zweitens eine andere Datei (im gleichen Verzeichnis), XType.java:

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

Ok ist es schlechte Programmierung, aber wenn Sie javac XType führen Sie es kompiliert: kompiliert sogar MType weil XType Bedürfnisse es. Aber ... MType braucht XType ... wie funktioniert das? Woher weiß der Compiler, was passiert?

Ich würde gerne wissen, wie der Compiler (Javac oder andere Compiler, die Sie kennen) diese Situation verwaltet, nicht, wie man es vermeidet.

Ich frage, weil ich einen Precompiler schreibe und ich möchte diese Situation verwalten.

Antwort

4

Sie benötigen einen 2-Pass zu nehmen, oder multi-pass Ansatz:

Sprachen wie Java benötigen einen Multi-Pass-Compiler, da die Definition von x nicht erforderlich wäre, vor dem Einsatz kommen:

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

Es gibt verschiedene Ansätze, zum Beispiel Sie folgendes tun könnte:

der erste Durchlauf für alle variabl aussehen könnte e-Deklarationen, die zweite für Methodendeklarationen usw. bis zum letzten Durchlauf verwendet alle diese Informationen, um den endgültigen Code zu kompilieren.

+0

Also, wenn es kompiliert die zweite Datei der Compiler bereits weiß, was der erste ist? –

+1

@Fabio - Jeder Durchlauf des Compilers verarbeitet alle Dateien, die die Informationen für den nächsten Durchlauf sammeln. – ChrisF

4

Die erste Datei muss nichts über XType wissen, außer dass es sich um einen Typ und ähnlich für MType in der zweiten Datei handelt. Auch in Java haben alle Objekte effektiv die gleiche Größe (weil auf alles über Referenzen zugegriffen wird), so dass die Größe des Objekts nicht benötigt wird. In anderen Sprachen ist dies nicht der Fall - Ihr Code würde beispielsweise nicht in C++ kompiliert (Sprachsyntax getrennt).

+2

aber wenn eine Methode von XType verwenden? Es muss Methoden von Xtype kennen .. nein? –

+0

auch, ich bin mir nicht sicher, was Sie meinen "alle Objekte sind effektiv die gleiche Größe". – asgs

+1

Er bezieht sich auf die Tatsache, dass (zum Beispiel) "m" eine Referenz enthält und alle Referenzen die gleiche Größe haben. Aber das ist nicht die einzige Information, die für einen Typ benötigt wird. Es ist auch notwendig, seine Mitglieder und viele Informationen über seine Super-Typ-Hierarchie zu kennen. –