Ich schreibe meine erste Programmiersprache, die objektorientiert ist und bisher so gut darin ist, eine einzelne "Klasse" zu erstellen. Aber nehmen wir an, ich möchte Unterricht haben, sagen wir ClassA
und ClassB
. Vorausgesetzt, diese beiden haben nichts miteinander zu tun, ist alles in Ordnung. Angenommen , ClassA
erstellt ein - ClassB
dies wirft jedoch zwei verwandte Fragen auf:
-Wie würde der Compiler beim Kompilieren wissen, ClassA
dass es ClassB
überhaupt existiert, und woher weiß er, ob es Eigenschaften gibt?
Meine bisherigen Gedanken waren: Anstatt jede Klasse zu einem Zeitpunkt zu kompilieren (dh zu scannen, zu analysieren und Code zu generieren), muss ich jede "Datei" (nicht wirklich Datei an sich, sondern eine "Klasse") zuerst scannen + analysieren , dann Code für alle generieren?
quelle
Ältere Sprachen sind manchmal strenger; Überlegen Sie, was in Java möglich ist:
Ich habe das Anti-Pattern oben gesehen und es ist wirklich hässlich (ich hätte es verboten). Beide Zusammenstellungseinheiten verwenden sich gegenseitig. Ifc kann jedoch zu Code kompiliert werden, ohne dass ein Implem kompiliert wurde. Der kompilierte Code .class, der mit einem C .obj vergleichbar ist, enthält "Verknüpfungsinformationen": einen Implem-Import, der einen parameterlosen Konstruktor aufruft
Implem()
. Die Implem-Klasse kann dann problemlos kompiliert werden. Teilweise dient der ClassLoader, der die Initialisierung / Erstellung von JVM-Klassendaten durchführt, und teilweise die Java Virtual Machine selbst als Linker , der alle integriert.Beispielsweise erkennt das Kompilieren mit einer Version einer bestimmten Bibliothek und das Ausführen mit einer anderen Version dieser Bibliothek Laufzeitfehler.
Die Antwort lautet also: Compilation liefert Einheiten kompilierten Objektcodes, die man als Code + Daten + API zum Verknüpfen ansehen muss.
Der Compiler sollte anschließend auch ein Packen durchführen und die Verknüpfungs-API überprüfen . eine zweite Phase.
Dies mag irritieren und unelegant aussehen, aber mathematische Beweise können auf die gleiche Weise funktionieren: Wenn man die gesamte Richtigkeit beweist, kann man bereits einen Teil als wahr betrachten, der bis zur Verifikation gültig ist.
quelle