Einzelnen Beitrag anzeigen

Benutzerbild von Phoenix
Phoenix
(Moderator)

Registriert seit: 25. Jun 2002
Ort: Hausach
7.606 Beiträge
 
#6

AW: Delphi vs. JAVA , Class Design

  Alt 7. Mai 2021, 05:58
Delphi hatte damals klassischerweise (und aus Performance-Gründen) einen Single-Pass Compiler. Das heisst, der ist einmal von vorne bis hintern durch alle Deine Files durch in der Reihenfolge wie sie im Projekt angegeben dann durch andere Dateien inkludiert wurden, und konnte zum Zeitpunkt X immer nur die Typen verwenden, die bis dahin schon bekannt waren. Unbekannte Typen etc. kann der Compiler daher ungeheuer Schnell anmeckern. Das ist zwar seit dem Umstieg auf einen neuen Compiler leicht anders, die Regeln sind aber beibehalten worden.

Andere Sprachen wie Java oder auch C# haben mit Multi-pass-Compilern angefangen. Dort geht der Compiler erst einmal durch alles durch und baut sich eine Liste mit allem was er schon gesehen hat, und bei Funktionen die Typen benutzen die er noch nicht kennt setzt er Platzhalter ein. Wenn er den Typen dann wirklich sieht, ersetzt er den Platzhalter. Erst wenn der Compiler dann am Ende immer noch offene Platzhalter hat, wirft er einen Fehler. Das macht den Compiler aber ein gutes stück komplexer und auch langsamer. Der eigentliche Code in den Methoden wird dann in einem zweiten Durchlauf durch das gesamte Projekt übersetzt.

C oder C++ lösen das Problem nochmal anders, in dem die Deklarationen in die sogenannten Header-Files kommen und in anderen Dateien dann der eigentliche Code.

Grundsätzlich sind zirkuläre Verweise (A nutzt B und B nutzt A) aber etwas, was man nach Möglichkeit vermeiden sollte. Ein Anwendungsgebiet wo sie Sinn machen sind doppelt verkettete Listen, und unter Umständen Objektmodelle die Datenbankstrukturen abbilden (Tabelle A hat einen Verweis auf B, wobei ein Eintrag in B auch wieder auf Einträge in Tabelle A verweisen kann). Aber auch da sollte es möglichst sparsam eingesetzt werden. Das ist vor allem problematisch wenn Datenstrukturen auf einmal wirklich einen größeren Kreis bilden (also Instanz 1 von Klasse A zeigt auf Instanz von Klasse B, die auf Instanz 2 von Klasse A die auf Instanz 2 von Klasse B zeigt die dann wiederum auf Instanz 1 von A zeigt). Wenn so eine Struktur dann serialisiert werden muss (also z.B. um sie in eine Datenbank oder in eine Datei zu schreiben oder übers Netzwerk verschickt werden muss), dann läuft man gerne in eine Endlosschleife.
Sebastian Gingter
Phoenix - 不死鳥, Microsoft MVP, Rettungshundeführer
Über mich: Sebastian Gingter @ Thinktecture Mein Blog: https://gingter.org
  Mit Zitat antworten Zitat