enter link description here W jaki sposób kompilator Java może tak szybko rozwiązywać odwołania między klasami, jeśli masz kilka klas, które odnoszą się do siebie nawzajem i używają nawzajem swoich metod?kompilatory + odwołania międzyklasowe: w jaki sposób javac robi to szybko, co kompilatory C++ robią powoli?
Wiem, jak działają kompilatory C++ w tym zakresie: każdy plik .cpp jest kompilowany osobno i używa tych okropnych plików .h do deklarowania pól/metod klas, tak aby ten sam zestaw plików był ponownie analizowany za każdym razem i/lub kompilatory muszą obsługiwać wstępnie skompilowane nagłówki.
Ale Java tego nie robi i nie ma separacji w źródle programu dla interfejsów klas/implementacji w sposób, w jaki Turbo Pascal je rozdzielił.
Widzę, że jeśli masz klasę Foo i odnosi się ona do klas Bar, Baz, Quux, które znajdują się w oddzielnym pliku barbazquux.jar, wtedy rzeczy będą proste: plik .jar został już skompilowany, więc gdy Foo.java zostanie skompilowana, może po prostu przyjrzeć się plikom .class w pliku barbazquux.jar.
Ale jeśli masz cykliczne odwołania do klas, a klasa Foo odwołuje się do paska klasy, który odwołuje się do klasy Foo, w jaki sposób może kompilować Foo.java bez konieczności kompilacji najpierw Bar.javy, a następnie zdecydować, że musi skompilować Foo.java i utknąć w pętli?
Co robi kompilator Java, aby obsłużyć odwołania między klasami?
edit: Yair zaznacza another question z odpowiedzi, które ogólnikowo wspomina Multipass kompilatorów. Okej, więc jest wiele przepustek. Co dokładnie dzieje się przy każdym przejściu i jak Java tak szybko się kompiluje? Czy musi ponownie przeanalizować każdy plik przy każdym przejściu, czy też przechowuje abstrakcyjne drzewo składniowe, aby zaoszczędzić czas lub co?
... i jak nazywa się to pojęcie, więc mogę dowiedzieć się więcej na ten temat, jeśli zdecyduję się zajrzeć do niektórych książek kompilatora? –
wygląda na dupę, na którą odpowiedziano. Zobacz [tutaj] (http://stackoverflow.com/questions/3032874/how-does-compiling-circular-dependencies-work). – yair
Zgaduję, ale to pytanie nie zawiera tak naprawdę odpowiedzi, które mówią bardzo. –