FreePascal && Interfaces

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: FreePascal && Interfaces

Beitrag von Patito »

lrlr hat geschrieben:also ganz so stimmt das aber nicht..
Da hast Du leider nicht recht.
ref-counting bei interfaces macht schon sinn (halt nicht immer)
Die paar Anwendungsfälle in denen Ref-Counting etwas nützt lassen sich aber leicht sauberer lösen. Am Sinn und Zweck von Interfaces in einer objektorientierten Sprache geht das Ref-Counting leider total vorbei.
>Bevor man ein Objekt freigibt muß man ALLE Interface-Referenzen auf das Objekt aus dem Speicher entfernen, sonst knallts irgendwann.

genau umgekehrt, wenn man ein objekt freigibt, und es gibt noch interface referenzen darauf, DANN knallts aufjedenfall ...
Lies meinen Satz bitte nochmal, und überlege Dir, ob Du dem wirklich widersprechen willst. Knallen tuts nur, wenn das Betriebssystem mitkriegt, dass die Speicherpage schon weg ist, oder wenn der freigegebene Speicher schon mit neuen Daten überschrieben wurde. Das eigentliche Problem ist, dass man den Fehler ohne Debug-Modus vom Speichermanager eher selten bemerkt.
meine meinung:
wenn man refcounted interfeces hat, darf man auch KEINE referenz auf das object selber haben..
freigeben darf man die objects selber ja sowieso nicht, die werden ja automatisch freigegeben..
Was natürlich völlig gegen den Sinn und Zweck von Interfaces in einer objektorientierten Sprache ist..
für bäume würd es noch "week references" geben, da muss man dann natürlich wieder aufpassen..
Natürlich kann man immer irgendwelche Tricks mit Pointer-Casting zur Laufzeit machen, aber sowas ist ehrlich gesagt wirklich grottiger Programmierstil. Vorallem wenn man stattdessen den Compiler prüfen lassen könnte ob das Objekt das Interface unterstützt...

Sorry... :x

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: FreePascal && Interfaces

Beitrag von lrlr »

java ist meiner meinung nach die "schönste" objektorientierte sprache, da wird sehr viel mit interfaces gearbeitet (u.U funktionierts dort besser , zwecks GC, wober der natürlich auch nachteile hat..)

>Bevor man ein Objekt freigibt muß man ALLE Interface-Referenzen auf das Objekt aus dem Speicher entfernen, sonst knallts irgendwann.

nochmal: du gibts ein object frei, und hast noch referenzen (interfaces) darauf, im extremfall sogar in einem plugin/dpl/wasauchimmer, was du u.U. garnicht mal kennst..

oder einfach in code der nicht von dir ist..


sobald auf das interface zurückgegriffen wird, kracht es..

anders herum, wenn es nur interfaces gibt, und keine referenzen direkt aufs object, kann dir "nix passieren"

gegenseitig referenzieren geht natürlich schlecht..

das problem hat aber auch m$ und excel usw.
da kann man auch mit active x ein excel interface erhalten, dann ein worksheet, dann excel auf Null setzen, danach hast auch ein nicht funktionierendes worksheet interface...

wenn man activex server schreibt, braucht man es einfach...
dass sie "programmintern" in code üder den man selber "die kontrolle" hat, mehr schaden als helfen, wird sicher stimmen..
aber du kannst nich sagen TInterfacedObject ist "müll", es ist einfach ein notwendiges übel,
wenn man es verwendet, muss man halt wissen was man macht..

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: FreePascal && Interfaces

Beitrag von Patito »

lrlr hat geschrieben:java ist meiner meinung nach die "schönste" objektorientierte sprache, da wird sehr viel mit interfaces gearbeitet (u.U funktionierts dort besser , zwecks GC, wober der natürlich auch nachteile hat..)
Ja. Dort läufts ohne Ref-Counting... Wobei GCs wirklich auch ziemlich problematisch sein können. Ernsthaft - für anspruchsvolle Programme braucht man gelegentlich deterministische Speicherverwaltung. Wenn man sich mal den Horror angetan hat zu schauen wie man sowas mit .NET hinbekommt vergeht einem echt die Lust auf GCs.
Die Borländer haben sich ja mit sowas ein schönes Eigentor geschossen. "Wir verwenden jetzt .NET für unsere IDE - Speicherverwaltung läuft jetzt automatisch" und dann hats geleakt bis zur Unbenutzbarkeit...

>Bevor man ein Objekt freigibt muß man ALLE Interface-Referenzen auf das Objekt aus dem Speicher entfernen, sonst knallts irgendwann.
nochmal: du gibts ein object frei, und hast noch referenzen (interfaces) darauf, im extremfall sogar in einem plugin/dpl/wasauchimmer, was du u.U. garnicht mal kennst..
oder einfach in code der nicht von dir ist..
sobald auf das interface zurückgegriffen wird, kracht es..
Nicht ablenken. Das hast Du auch mit Objekten. Und niemand wird bei denen von Dir verlangen immer alle Referenzen aufzuräumen. (Vergleiche das Beispiel von vorher: Eine ObjektListe mit Baumknoten kann man freigeben ohne, dass man erst langwierig die Knoten untersuchen muss und alle Referenzen zwischen den Knoten in der richtigen Reihenfolge entfernen muss).

Wenns ganz sauber sein soll kann man für die Entfernung von Referenzen das Observer-Pattern verwenden und eine Nachricht broadcasten, die allen Abonenten des Interfaces/Objekts mitteilt, dass sie ihre Referenz jetzt entfernen müssen. Das hat aber nichts mit Interfaces an sich zu tun, sondern gilt genauso für Objekt-Referenzen.
anders herum, wenn es nur interfaces gibt, und keine referenzen direkt aufs object, kann dir "nix passieren"
gegenseitig referenzieren geht natürlich schlecht..
Mit der Einstellung wirst Du leaken bis der Arzt kommt... "Nix passieren" ist falsch - eher "Wenns ein Problem gibt sieht man keine vernünftige Fehlermeldung". Im besten Fall leakt man - im schlechteren Fall benutzt jemand das durch die Referenz künstlich am Leben gehaltene Objekt - obwohl es eigentlich schon längst Tod sein sollte.
Stell dir vor das Objekt ist eine Bestellung von 10 Tonnen nassem Beton, die in deinen Vorgarten geliefert werden - willst Du das Objekt freigeben - und riskieren, dass es crasht wenn jemand auf "Versenden" klickt. Oder reicht es Dir deine Referenz zu entsorgen und hoffst dann darauf, dass niemand anderes im Programm eine Referenz hat.
(Destruktoren deterministisch aufrufen können hat einen Sinn!)
das problem hat aber auch m$ und excel usw.
da kann man auch mit active x ein excel interface erhalten, dann ein worksheet, dann excel auf Null setzen, danach hast auch ein nicht funktionierendes worksheet interface...
Genau. Ref-Counting funktioniert nicht mal vernünftig bei den Sachen für die es desigt wurde. Das doofe bei z.B. Word ist auch noch, dass selbst wenn man das Worksheet/Region oder was auch immer später nullt der ursprüngliche Word-Prozess dann immer noch herumhängt bis ihn jemand von Hand abschießt... (die Region-Referenz verhindert die Beendigung des Prozesses, Region-Referenz nullen führt nicht dazu, dass der Prozess beendet wird...)
wenn man activex server schreibt, braucht man es einfach...
dass sie "programmintern" in code üder den man selber "die kontrolle" hat, mehr schaden als helfen, wird sicher stimmen..
aber du kannst nich sagen TInterfacedObject ist "müll", es ist einfach ein notwendiges übel,
wenn man es verwendet, muss man halt wissen was man macht..
Gut an jedem 32.Mai braucht man mal was für COM. Für Interfaces innerhalb einer Programmiersprache ist es aber Müll. Und die COM-geschichten könnte man sicher auch anders lösen... Statt über die RefCounting zu gehen könnte man in Object-Pascal aus auch die Methodenaufruf _AddRef, _Release selbst aufrufen.

Ich bleibe dabei. Das Ding ist Müll. Und ich vermute ernsthaft, dass derjenige, der das designt hat, nicht mehr alle Tassen im Schrank hat..

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: FreePascal && Interfaces

Beitrag von lrlr »

ich verstehe ansich deine meinung
bin auch großteils deiner meinung

möcht aber noch 2 sachen anmerken

1. hat das nicht delphi/borland erfunden sondern M$
http://msdn.microsoft.com/en-us/library ... 85%29.aspx" onclick="window.open(this.href);return false;

2. JAVA: Ja. Dort läufts ohne Ref-Counting...

müsste heißen: dort läuft ALLES mit ref-counting, auch die objects...

3. Im besten Fall leakt

ja, dazu neigen die .net und java programme.. (ist ein bisserl wie mit threads, wenn man nicht GENAU weiß was man macht, funktionierts zwar,aber nicht lange...)

ohne GC hast halt andere probleme (vor FastMM zeiten vorallem) mehrfach freigegebene objekte, referenzen auch freigegebene objekte usw.

mschnell
Beiträge: 3444
Registriert: Mo 11. Sep 2006, 10:24
OS, Lazarus, FPC: svn (Window32, Linux x64, Linux ARM (QNAP) (cross+nativ)
CPU-Target: X32 / X64 / ARMv5
Wohnort: Krefeld

Re: FreePascal && Interfaces

Beitrag von mschnell »

lrlr hat geschrieben: JAVA: Ja. Dort läufts ohne Ref-Counting...
Das ist aber keine Frage von "Interfaces", sondern eine Frage der Freigabe von Objekten generell.
In "nativen" Sprachen müssen Objekte vom Programm aktiv freigegeben werden: entweder durch User-Source-Code ("free") oder automatisch durch Ref-Counting. Sprachen, die in einem "Framework" Ablaufen (z.B. Java, Python oder .NET), das automatische Garbage-Collection macht (indem es sucht, ob auf irgendwelche Objekte Referenzen bestehen), brauchen keine explizite Freigabe und demzufolge auch kein Ref-Counting.

-Michael

lrlr
Beiträge: 127
Registriert: Di 3. Nov 2009, 09:48

Re: FreePascal && Interfaces

Beitrag von lrlr »

stimmt, GC scheint garkein refcounting zu machen (ich hab mich nicht damit beschäftigt, wie das intern genau funktioniert, ich meinte eh das prinzip dass sie eben automatisch freigegeben werden.. )

Patito
Beiträge: 203
Registriert: Di 22. Sep 2009, 13:08
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit

Re: FreePascal && Interfaces

Beitrag von Patito »

lrlr hat geschrieben:ich verstehe ansich deine meinung
bin auch großteils deiner meinung
möcht aber noch 2 sachen anmerken
1. hat das nicht delphi/borland erfunden sondern M$
http://msdn.microsoft.com/en-us/library ... 85%29.aspx" onclick="window.open(this.href);return false;
Gegen _AddRef und _Release für COM-Objekte habe ich auch nichts. Das Ganze in die Object-Pascal Zuweisungsoperatoren einzubauen war aber keine so gute Idee von Borland...
2. JAVA: Ja. Dort läufts ohne Ref-Counting...
müsste heißen: dort läuft ALLES mit ref-counting, auch die objects...
Ref-Counting ist ja nur eine (zeimlich mieserable) Art von GC. Java macht das intern deutlich besser...
3. Im besten Fall leakt
ja, dazu neigen die .net und java programme.. (ist ein bisserl wie mit threads, wenn man nicht GENAU weiß was man macht, funktionierts zwar,aber nicht lange...)
ohne GC hast halt andere probleme (vor FastMM zeiten vorallem) mehrfach freigegebene objekte, referenzen auch freigegebene objekte usw.
Mit der Speicherverwaltung ist es eben wie mit einem Labyrinth, in dem man mit dem GC die Wände unsichtbar machen kann. Manche Leute finden das "transparenter". Letztenendes muss man aber dann gelegentlich doch alles was der GC so macht reverse-engineeren und rückgängig machen... (Hab mal einen Artikel zu .NET Speicherverwaltung gelesen - schlimmer und komplizierter geht es wirklich nimmer). Mit FastMM hat man es da in Delphi wesentlich einfacher - mit FPC muß ich mich erst noch ein wenig vertrauter machen...

marcov
Beiträge: 1102
Registriert: Di 5. Aug 2008, 09:37
OS, Lazarus, FPC: Windows ,Linux,FreeBSD,Dos (L trunk FPC trunk)
CPU-Target: 32/64,PPC(+64), ARM
Wohnort: Eindhoven (Niederlande)

Re: FreePascal && Interfaces

Beitrag von marcov »

Patito hat geschrieben: ...

Ref-Counting ist ja nur eine (zeimlich mieserable) Art von GC. Java macht das intern deutlich besser...
Vor so weit ich weiss, bemueht Java sich gar nicht mit nicht GCed objekten. Und das ist das wichtige von ref-counting. Das ist eine sichere Masse Transparant und Kompatible mit normale allocationen und pointers.

Antworten