Es gibt eine Reihe von Möglichkeiten, wie ein Compiler dies tun kann:
Ansatz # 1: Machen Sie zwei Pässe über den Parsing-Baum:
- In Durchgang 1, alle Erklärungen finden und alle Umfang Grenzen und füllen Sie eine Symboltabelle .
- In Pass 2 finden Sie alle Bezeichnerreferenzen und lösen sie anhand der Symboltabelle.
Ansatz # 2: einen einzigen Durchlauf über den Parsing-Baum Marke:
- eine Symboltabelleneintrag erstellen, wenn eine Erklärung
- angetroffen wird, wenn eine Kennung Referenz angetroffen wird:
- Versuchen Sie, es in der Symboltabelle
- aufzulösen, wenn die Auflösung fehlschlägt, fügen Sie es zu einer Liste hinzu, um später aufgelöst zu werden
- Am Ende des Durchlaufs, besuche alle Identifikatoren in der Liste und versuche, sie erneut gegen die (jetzt vollständige) Symboltabelle aufzulösen.
Und es gibt Variationen und möglicherweise andere Ansätze.
Aber wenn Sie wirklich wissen wollen, wie der Java-Compiler eigentlich tut, schauen Sie sich den OpenJDK-Quellcode an.
Ein Verweis auf eine Klasse an sich ist eigentlich einfacher.In Ihrem Beispielcode "sieht" der Compiler den Parserbaumknoten für public class myClass
, bevor er die Verwendung von myClass
sieht. Wenn es auf Letzteres trifft, ist der Eintrag für myClass
bereits in der Symboltabelle.
(In altmodischer Sprache wie C, die Erklärung und Definition einer Funktion kann getrennt sein, aber Sie können auf eine Kennung beziehen, wenn sie früher in der Übersetzungseinheit erklärt wurde.)
1 - Wenn Sie nicht wissen, was eine Symboltabelle ist, gibt es gute Bücher über Compiler und Compileraufbau.
Java ist OpenSource, schauen Sie sich den Quellcode an. ;-) – Vampire
Compiler sprechen nicht so mit sich selbst. – ChiefTwoPencils