Re: Freizeit in D investieren?
Geizhals » Forum » Programmierung » Freizeit in D investieren? (9 Beiträge, 545 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
.  Re: Freizeit in D investieren?  (Somnatic am 19.05.2007, 15:22:08)
.
Re: Freizeit in D investieren?
19.05.2007, 20:59:43
Die Meinung von einem Freund von mir zum Thema D - ich habe die E-Mail mal ausgegraben:

Mein Freund schrieb:
Ich habe ja voriges Jahr einige Zeit lang mit "D" gearbeitet.

Allerdings habe ich es dann wieder aufgegeben, weil ich einen
gravierenden Mangel entdeckt hatte: Zwar *gibt* es Destruktoren wie in C++, d. h. welche die nicht von der Garbage Collection aufgerufen werden, sondern wenn der jeweilige Scope verlassen wird.

Das macht es auch in D grundsätzlich möglich, "intelligente" Objekte wie "Filehandle" zu definieren, welche die zugrunde liegende Datei
automatisch mit "Close" schließen, sobald der Gültigkeitsbereich
verlassen wird in dem das Objekt definiert ist.

Dieses Destruktoren-Feature ist insbesondere, aber nicht nur in
Verbindung mit Exception-Handling sinnvoll, um dafür zu sorgen dass alle Ressourcen zur rechten Zeit wieder aufgeräumt werden.

In JAVA muss man in solchen Fällen ja manuell einen "close"-Aufruf in den "finally"-Handler schreiben, sonst bleibt die Datei offen bis die GC irgendwann (spätestens bei Programmende) geruht, den Destruktor aufzurufen welcher die Datei (hoffentlich) ebenso schließen wird.

Jedoch ärgert es mich, sinnlos ständig irgendwelche Dinge in
"finally"-Handler hinschreiben zu müssen, die ein Destruktor unter C++ automatisch tut.

Ich sehe das Fehlen von zu definierten Zeitpunkten aufgerufenen
Destruktoren jedenfalls als die größte Schwäche von JAVA an, die ich
bisher kenne.

Perl hat hier einen Zwischenweg gewählt: Es ruft die Destruktoren genau wie C++ auf sobald der Scope verlassen wird - jedoch nur wenn keine weiteren Referenzen auf ein Objekt mehr bestehen. In diesem Fall  wird der Destruktor dann aufgerufen, sobald die letzte Referenz aufgelöst wurde.

Und nur wenn das Programmende erreicht wird und immer noch Referenzen bestehen, wird eine Art Garbage Collection ausgelöst welche alle Objekte zwangsweise freigibt.

D hingegen unterstützt beide Ansätze: Defaultmäßig arbeitet es wie JAVA, also GC und verzögerter Destruktorenaufruf.

Wenn man jedoch eine Objekt-Variable explitit als "auto" deklariert,
dann wird auf das Objekt auf welches diese Variable verweist die C++ Methode angewendet.

D. h. sobald der Gültigkeitsbereich der Variable verlassen wird, wird
der Destruktor aufgerufen und das Objekt zerstört. OHNE warten auf die GC.

Das beste beider Welten...

...so dachte ich.

Bis ich drauf kam: Das funktioniert zwar - aber nur, wenn man das "auto" JEDESMAL zu JEDER Deklaration einer Variable dazuschreibt!

Sprich, man kann das "auto" nicht etwa zur Klassendefinition dazu
schreiben - damit jedes Objekt dieser Klasse sich immer nach der C++ Semantik verhält.

Statt dessen kann man, wann immer man eine Referenzvariable für ein Objekt einer Klasse irgendwo anlegt, "auto" dazu schreiben, oder nicht.

Und es gibt auch keinerlei Compiler-Warnung, wenn man etwa an einer Stelle für eine Objektvariable "auto" dazuschreibt, und ein paar Zeilen später für eine zweite Objektvariable DERSELBEN Klasse *nicht*.

Statt dessen bekommt man einfach 2 Objektvariablen für Objekte derselben Klasse, die ein völlig unterschiedliches Destruktoren-Verhalten aufweisen!

Sprich, wenn man irrtümlich irgendwo "auto" hinzuschreiben vergisst, wird man nicht gewarnt sondern das Programm verhält sich einfach anders als man es erwarten würde.

Ich fand das einen himmelschreienden Wahnsinn!

Denn wie leicht kann man einmal "auto" hinzuschreiben vergessen. Und es wird keinen Fehler geben, und das Programm wird immer noch oft genug funktionieren, da die GC doch rechtzeitig genug daher kam bevor es Probleme gab.

Nur ist so etwas eben total unsicher - man schreibt Programme, wo
tickende kleine Zeitbomben schlummern, und ohne es zu merken; nur weil man irgendwo "auto" hinzuschreiben vergessen hat.

Besonders teuflisch ist dabei der Umstand, dass man das "auto" ja nicht für alle, sondern nur für bestimmte Klassen verwenden will.

Man kann sich daher nicht "von Haus aus" daran gewöhnen, immer ein "auto" hinzuschreiben, weil man das eben nicht immer haben will.

Na jedenfalls - solange D diesen Blödsinn nicht abschafft, ist es
unbrauchbar.

Weil dann kann ich gleich JAVA nehmen, da schreibe ich statt "auto" halt einen "finally"-block. Und habe dafür den Vorteil einer in langjährigem Praxiseinsatz erprobten Sprache mit umfangreichen Bibliotheken und Benutzerbasis.

Nein, wenn D gegen JAVA oder C++ anstinken will, dann muss es schon *besser* sein als beide, und nicht nur deren Nachteile kombinieren...



Antworten PM Alle Chronologisch Zum Vorgänger
 
Melden nicht möglich
..  Re(2): Freizeit in D investieren?  (Xmolch am 19.05.2007, 23:22:48)
.  Re: Freizeit in D investieren?  (Xmolch am 19.05.2007, 22:36:43)
..  Re(2): Freizeit in D investieren?  (Xmolch am 19.05.2007, 22:41:27)
.  Re: Freizeit in D investieren?  (komplexler am 19.05.2007, 23:29:23)
..  Re(2): Freizeit in D investieren?  (Xmolch am 19.05.2007, 23:58:18)
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung