Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Garbage Collector für Delphi-Objekte? (https://www.delphipraxis.net/171824-garbage-collector-fuer-delphi-objekte.html)

himitsu 25. Nov 2012 04:14

Garbage Collector für Delphi-Objekte?
 
Jetzt (noch) nicht (unbedingt) nervig, aber vielleicht erstmal nur ein bissl erschreckend ... wem ist im XE3-Quellcode etwas aufgefallen?

Man versucht nun von hinten durch die Brust das TObjekt in ein eine Art Interface umzuwandeln und mit einer Referenzzählung zu versehn.


Eigentlich hatte ich nun endlich mal ein System für mehrfach gegenseitig kreuzreferenzierende Objekte, aber jetzt hab ich Angst, daß mir diese blöde Referenzzählung irgendwann alles wieder kaputt macht und ich wunderschöne "Speicherlöscher" erhalte. :cry:

haentschman 25. Nov 2012 15:47

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
@himitsu:

Bei deinem genervt sein was Delphi betrifft mußt du aufpassen, daß der Server für die Delphi Tage Tickets für deinen Nick unerreichbar ist... :lol:

...oder schule zum Kindergärtner um. :cheer:

himitsu 25. Nov 2012 15:50

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Bei Letzterem hat selbst Synopse ein eher ungutes Gefühl.

Ich würde mir ja wünschen, daß mehr Zeit in den neuen Compiler, Linux, Android, Bugs, OH usw. gelegt wird und nicht in sowas. :cry:

stahli 25. Nov 2012 15:54

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Zitat:

Zitat von haentschman (Beitrag 1192867)
@himitsu:
Bei deinem genervt sein was Delphi betrifft mußt du aufpassen, daß der Server für die Delphi Tage Tickets für deinen Nick unerreichbar ist... :lol:
...oder schule zum Kindergärtner um. :cheer:

Es ist eine Haßliebe, wer will es ihm verdenken...
In letzter Zeit entwickle ich Verständnis dafür (ok, mit leicht anderem Hintergrund).

Stevie 26. Nov 2012 07:11

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Zitat:

Zitat von himitsu (Beitrag 1192807)
Man versucht nun von hinten durch die Brust das TObjekt in ein eine Art Interface umzuwandeln und mit einer Referenzzählung zu versehn.

So funktioniert nunmal ARC...

himitsu 26. Nov 2012 09:30

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Weißt du wie oft, vorallem bei Fremdkomponenten und auch bei Emba selber, Objekte in z.B. irgendwelchen "Integern" oder Pointern gespeichert werden?
Da wird nichts gezählt und schon knallt's schnell mal.

Free gibt es zwar immernoch, aber Free gibt nun nichts mehr "direkt" frei.
Und bei Kreuzreferenzen muß man dann auch noch extrem aufpassen, da sie sich selber im Speicher halten können, vorallem da sie nicht mehr auf Free hören.

BUG 26. Nov 2012 13:25

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Ich kann mir vorstellen, dass sich die Integration in Systeme mit GC wesentlich besserer macht, wenn man selbst irgendeine Art von GC hat.
Wenn man allerdings schon etwas wie die RTTI hat, fände ich es merkwürdig, sich gerade Reference-Counting auszusuchen.

jaenicke 26. Nov 2012 13:37

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Ich denke da speziell an Windows RT...
Das habe ich zwar noch nicht gesehen, aber ich vermute mal ein GC ist da hilfreich.

BUG 26. Nov 2012 15:42

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Zitat:

Zitat von jaenicke (Beitrag 1193016)
Ich denke da speziell an Windows RT...

Fast alle neueren Plattformen haben einen GC (imho mit Recht).
Android (Java), WinRT (.net), Browser (HTML5+JavaScript) ... oh, sieh an, in Objective-C werden auch fleißig Referenzen gezählt :?

himitsu 26. Nov 2012 17:29

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Dann wäre ja delphi irgendwann so wie dieses komische C# :shock:

Nja, und dafür wären dann auch viele Codes vor und nach diesem halben GC praktisch nicht mehr kompatibel.

Medium 26. Nov 2012 18:23

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Wieso? Einfach .Free() seiner Funktion berauben (was im Compiler prima geht), alles was manuell mit SPeicher rum macht ist auch sicher, da GetMem/FreeMem New/Dispose wohl nicht angefasst werden, und ich kann mir im Moment nichts vorstellen was man sinnvoll anderes an Konstrukten mit gutem Gewissen gebaut haben könnte. Selbst wenn: Es wäre ein Hack, und würde "mit Recht" kaputt gehen, zumindest aber nicht unerwartet (wenn man einigermaßen sauber zu Werke ging). Es ist ja jetzt nicht neu, dass Hacks nach Versionsänderungen (oder sogar schon Patches) dahin sein können. Das nimmt man wissentlich in Kauf wenn man anfängt zu frickeln. (Tu ich ja auch ab und an, aber ich bin dann nicht knüsselig wenn es mal nicht mehr geht oder geändert werden muss.)

stahli 26. Nov 2012 21:18

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Zitat:

Zitat von himitsu (Beitrag 1192807)
Jetzt (noch) nicht (unbedingt) nervig, aber vielleicht erstmal nur ein bissl erschreckend ... wem ist im XE3-Quellcode etwas aufgefallen?
Man versucht nun von hinten durch die Brust das TObjekt in ein eine Art Interface umzuwandeln und mit einer Referenzzählung zu versehn.
Eigentlich hatte ich nun endlich mal ein System für mehrfach gegenseitig kreuzreferenzierende Objekte, aber jetzt hab ich Angst, daß mir diese blöde Referenzzählung irgendwann alles wieder kaputt macht und ich wunderschöne "Speicherlöscher" erhalte. :cry:

Kann das mal jemand in einen eigenen Thread auslagern?
Was sind die genauen Konsequenzen?
Greifen die Änderungen auch bei einer klassischen Objekterzeugung - sprich: Das das Auswirkungen auf bestehende Projekte?

Ich habe zwar mal die Quelle angesehen, aber meine Brille ist wohl irgendwie nicht ganz scharf gestellt... ;-)

himitsu 26. Nov 2012 21:43

AW: Was nervt euch so, während der Programmierung oder so allgemein
 
Ich melde es gleich mal einen Mod ... muß nur noch schnell den Anfangsbeitrag raussuchen.
Wer dann antworten möchte, kann's da drüben machen (mach ich dann auch gleich)

himitsu 27. Nov 2012 10:04

AW: Garbage Collector für Delphi-Objekte?
 
Nja, im Prizip greifen dann in etwa die selben Mechianismen bei Objekten, wie sie schon für Interfaces gelten.


Mal im Ernst, wir haben doch Interfaces und Objekte.
Wenn man das Verhalten eines Interfaces will, dann sollte man Dieses doch auch verwenden? :gruebel:
(bekommt man den schweren Anhänger nicht weg, dann spannt man einen Traktor davor und nicht den Ferrari)

Ich freu mich schon auf die Verknubbelung der verschiedenen Techniken.
TComponent+Owner, Interfaces mit und ohne Referenzzählung, das Free/Destroy der Objekte und dann noch das Neue.

Außerdem, wenn schon Garbage Collector, dann doch gleich richtig?
Hier ist es scheinbar ausschließlich für Objekt-Instanzen vorgesehn.
Also die neue Funktion ... Interfaces, dynamische Arrays, LongStrings und Variant mal außer Acht gelassen, woran sich seit Jahrzehnten, praktisch schon fast immer, nichts dran geändert hat.



Ach ja, es geht übrigens um den Compilerschalter
Delphi-Quellcode:
{$IFDEF AUTOREFCOUNT}

[WARUMHABENWIRKEINENSPOILERODERSO]
Der sich eventuell duch einen Parserfehler(?) schon massenhaft in der OH eingenistet hat.

Zitat:

Zitat von Wie ich dieses Parsermistding hasse -.-
Embarcadero Technologies verfügt zurzeit über keine zusätzlichen Informationen. Bitte unterstützen Sie uns bei der Dokumentation dieses Themas, indem Sie Ihre Kommentare auf der Diskussionsseite eingeben.

[/WARUMHABENWIRKEINENSPOILERODERSO]

und vermutlich das Attribut
Delphi-Quellcode:
[Weak]
synopse - Delphi XE3 is preparing reference counting for class instances
Roman's Blog




Einfache Beispiele, welche bestimmt an vielen Stellen Probleme bereiten könnten werden, wären z.B. die TList und alles Andere, wo "Objekte" in einem Data-"Pointer" hinterlegt werden.
Oder Objekte per Messages verschicken. (programmintern natürlich)

In Delphi werden bis jetzt problemlos Objekte ständig umhergecastet (OK, bei Win64 nicht ganz unproblematisch, aber da sind die Programmierer ja praktisch obftmals selber dran Schuld)
und genau an diesen Stellen muß es doch zangsläufig die Referenzzählung falsch zählen.




Kreuzreferenzen werden eventuell auch Spaß bereiten.
- ObjektB kennt ObjektA (in einem Feld gespeichert)
- ObjektA kennt und verwaltet ObjektB (in einem Feld gespeichert)
- im Destructor von A wird B freigegeben

Da hier aber eine Referenz von A in B drinsteckt, wird nichmal mehr beim A.Free der Destructor aufgerufen, da es ja noch eine weitere Referenz gibt.
Wie/Ob die es machen, daß beim Freigeben von A die Referenz in B automatisch auf nil gesetzt wird, würde ich gerne wissen (klingt aber so, als wenn die das eventuel machen wollen?)



Ganz im Ernst. Wie haben doch schon Interfaces ... warum verwendet man Diese nicht einfach, wenn man ihre Funktionalität z.B. für WinRT benötigt.
Ich hatte doch auch mal vorgeschlagen, daß man die Interfaceverwaltnug/-erstellung für sowas hätte vereinfachen können.

Im Compiler eine Funktion/Befehl, welcher aus den Public-Schnittstellen eines Objektes "automatisch" ein Interface erstellt.

z.B.:
Delphi-Quellcode:
type
  TMyObject = class(TInterfacedObject)
  public
    function Irgendwas: Integer;
  end as IMyInterface['{6C68C66B-ED43-42D1-8BF2-B41327A31673}']; // mit oder ohne GUID
IMyInterface sähe in diesem Fall dann intern so aus:
Delphi-Quellcode:
type
  IMyInterface = interface
    ['{6C68C66B-ED43-42D1-8BF2-B41327A31673}']
    function Irgendwas: Integer;
  end;
Wenn die keine Lust haben für ihre neue WinRT-API für jedes Objekt ein Interface zu erstellen, dann ginge das auch automatisch, ohne die Objekte selber verschandeln umbauen zu müssen.

jaenicke 27. Nov 2012 10:33

AW: Garbage Collector für Delphi-Objekte?
 
Zitat:

Zitat von himitsu (Beitrag 1193173)
In Delphi werden bis jetzt problemlos Objekte ständig umhergecastet (OK, bei Win64 nicht ganz unproblematisch, aber da sind die Programmierer ja praktisch obftmals selber dran Schuld)
und genau an diesen Stellen muß es doch zangsläufig die Referenzzählung falsch zählen.

Diese Altlasten aus Zeiten vor Generics müssen dann eben erneut sauber implementiert werden.
Wer solchen Code heute mit einem aktuellen Delphi noch schreibt / schreiben lässt, ist selber schuld.

Stevie 27. Nov 2012 12:12

AW: Garbage Collector für Delphi-Objekte?
 
Klassischer Fall von "keinem kann mans recht machen".

Auf der einen Seite schreien genug Leute, dass man neue Features in die Sprache bringen soll und breaking changes in Kauf nehmen soll (wenn man das nicht will, muss man halt auf der letzten Version vor dieser Änderung bleiben, Pech) und auf der anderen Seite schreien die Leute, wenn dann was geändert wird für einen "nextgen compiler", weil sie diesen am liebsten immernoch mit in Delphi 1 erstelltem Sourcecode füttern wollen.

Außerdem bin ich mir nicht sicher und kann mir kaum vorstellen, dass man bei einer VCL Anwendung plötzlich das ARC Model angeschaltet hat.
Soweit ich weiß, wird das eher für die Apple Plattformen nützlich sein (wie auch im Blogpost von Arnaud am Ende erwähnt wurde).

stahli 27. Nov 2012 13:35

AW: Garbage Collector für Delphi-Objekte?
 
Geschrien hat ja noch keiner.
Aber u.U. ist das eine weitreichende Änderung (vielleicht Verbesserung?), über die die Entwickler aufgeklärt werden sollten.
Dann gäbe es auch weniger Spekulationen darüber.

himitsu 27. Nov 2012 13:58

AW: Garbage Collector für Delphi-Objekte?
 
Jupp, im Augenblick herst erstmal nur Unwissen, Angst und bissl Panik.

Grundsätzlich haben wir ja nichts gegen Neuerungen.
Aber die meisten aktuellen Änderungen/Neuerungen waren (abgesehn von Unicode und 64 Bit, bzw. XPlattform) eher nur "Erweiterungen", welche die Grundfunktionen fast nie grundlegend veränderten.

Hier ist es ja so, daß quasi heimlich im Hintergrund an einer (bewährten etablierten) Grundfunktion aus'm letzten Jahrtausend rumgespielt wird
und das bisher eher nur zufällig entdeckt wurde, weil ausversehn Einige im Quellcode drübergestolpert sind, es aber vorher scheinbar nichtmal erwähnt wurde.

Stevie 27. Nov 2012 14:29

AW: Garbage Collector für Delphi-Objekte?
 
Zitat:

Zitat von stahli (Beitrag 1193233)
Geschrien hat ja noch keiner.

Hier vielleicht ;)

Zitat:

Zitat von himitsu (Beitrag 1193236)
Hier ist es ja so, daß quasi heimlich im Hintergrund an einer (bewährten etablierten) Grundfunktion aus'm letzten Jahrtausend rumgespielt wird und das bisher eher nur zufällig entdeckt wurde, weil ausversehn Einige im Quellcode drübergestolpert sind, es aber vorher scheinbar nichtmal erwähnt wurde.

Es ist kein Geheimnis, dass ARC in Delphi Einzug halten wird.

himitsu 27. Nov 2012 14:37

AW: Garbage Collector für Delphi-Objekte?
 
Das kann man auch so lesen, daß es ein neues (zusätzliches) Objektformat gibt ... daß direkt an TObject rumgeschraub wird, kann ich da nicht rauslesen. :angle:

Stevie 27. Nov 2012 14:42

AW: Garbage Collector für Delphi-Objekte?
 
Zitat:

Zitat von himitsu (Beitrag 1193243)
Das kann man auch so lesen, daß es ein neues (zusätzliches) Objektformat gibt ... daß direkt an TObject rumgeschraub wird, kann ich da nicht rauslesen. :angle:

Und das ist so schlimm, wenns beispielsweise nur für den ARM Compiler aktiviert ist?

himitsu 27. Nov 2012 14:57

AW: Garbage Collector für Delphi-Objekte?
 
Neee.

Wie gesagt, aktuell isses ja nicht klar, wie, wo und ob das nun reinkommt.


Wenn es nur für ARM/WinRT ist, dann isses fast wie beim Firemonkey ... man muß eh nahezu alles neu machen und mit Altcode gibt's sowieso keinerlei Probleme (da es noch Keinen gibt).

Es wäre dann aber immernoch etwas "verwirrend", wenn man nun beachten müßte, daß ein TObjekt dort drüben anders funktioniert, als anderswo.
Auch gemeinsame Codes zwischen Delphi und Lazarus würde es betreffen.

Kann man mit Lazarus nicht schon für ARM kompilieren?


Im Wiki steht bei ARC was davon, daß es in Delphi Object Pascal nur bei Strings gibt.
Stimmt so doch garnicht :shock: (auch alle anderen dynamischen Arrays und Interfaces)
http://de.wikipedia.org/wiki/Automat...rence_Counting
Zitat:

Ein Problem bei dieser Technik sind zyklische Verweise, das heißt zwei oder mehrere Objekte die gegenseitig aufeinander verweisen. Falls dabei Objekte nur noch gegenseitig aufeinander verweisen und kein Verweis von außen mehr existiert, das heißt von anderen Objekten außerhalb des Zyklus, sind die jeweiligen Referenzzähler nicht 0 und es ist nicht so ohne weiteres erkennbar, dass diese Objekte eigentlich nicht mehr benötigt werden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:54 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz