Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

101

20.05.2016, 16:07


Auch "GC" genannt ;).

Als Notfallsystem, falls Programmierer aus Versehen oder aus purer Faulheit Zyklen eingebaut haben, weil sie sich eben nicht mit ihrem System und deren Komponenten zu sehr auseinandersetzen wollten. Oder weil sie schlicht unfähig waren, das kommt auch vor. :D
Aber der GC ist eben nur als Notfallsystem da, um zyklische Referenzen aufzulösen - nicht aber für den generellen Zweck der Speicherverwaltung. Das meinte ich, als ich vor einigen Seiten sagte, dass PHP nicht gänzlich deterministisch ist.
Auch Python arbeitet so. Und das Paper, das im PHP-Artikel verlinkt ist, beschreibt wie so ein GC mit RC in die "Jalapeno˜ Java virtual machine" eingebaut wurde. Ich weiß nicht worauf Du hinaus willst.

H5::

Treue Seele

Beiträge: 368

Wohnort: Kiel

  • Private Nachricht senden

102

20.05.2016, 16:10

Wenn ich davon aus gehe, dass ich Programmiere und genau weiß was ich da mache, ich Kollegen habe auf die ich mich verlassen kann, dann denke ich auch, dass ein GC eher hinderlich ist. Für mich gibt es da aber ein ganz großes ABER, und dieses Aber entspringt der heutigen Zeit. Ich weiß oft nicht mehr welche Kollegen alles mit mir an einem Projekt Rumpfuscht, ich kann mich nicht darauf verlassen ob diese ihr Handwerk auch wirklich beherrschen.

Und genau da spielt der GC seine Vorteile aus, er hilft den Faktor Mensch beim Programmieren zu minimieren. Er kann nicht alles besser machen, aber er kann zumindest dafür sorgen, dass eine kritische Ressource etwas weniger schwer wiegt.

Viele hier können Programmieren und wissen was sie tun, leider gilt dies nicht für alle die dort draußen Software produzieren. Und mitunter haben ziemlich schlechte Programmierer richtig gute Ideen und zudem Zeit gefunden diese umzusetzen. Und leider hat so ein Chef oft nicht die Geduld mich alles noch einmal neu und Ordentlich Programmieren zu lassen.

Ich denke ein GC dient nicht dazu das Speicherproblem perfekt zu lösen, sondern das Problem Mensch im Zusammenhang mit dem Speicher abzumildern. Es ist definitiv kein Werkzeug für jeden.

Insbesondere in der heutigen OpenSource Zeit habe ich das Gefühl, das ein GC nicht unbedingt der Fluch ist den jemand erfahrenes in ihm sieht. Zumindest sind dies meine Erfahrungen seit dem ich Go vermehrt nutze. Ich habe ein weit weniger schlechtes Gefühl Fremdcode in ein Projekt zu integrieren als es mit C++ der Fall ist.
:love: := Go;

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

103

20.05.2016, 16:16

Auch Python arbeitet so. Und das Paper, das im PHP-Artikel verlinkt ist, beschreibt wie so ein GC mit RC in die "Jalapeno˜ Java virtual machine" eingebaut wurde. Ich weiß nicht worauf Du hinaus willst.

Auf nichts, wieso? Ich hab' nur ein Paper verlinkt auf Schorsch Aussage & kurz erläutert wie PHP das intern handhabt (und auch Python wie du richtig bemerkt hast).
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

104

20.05.2016, 16:20


Na das zählt ja nicht als Antwort wenn es am Ende dann mit einem GC gelöst wird.
Das sollte eh schon durch das bestehende Design der Software feststehen. Wenn nicht, dann sollte man sich damit mal beschäftigen. Denn wer was besitzt oder nur kennt ist eig. ein recht wichtiger Teil der gesamten Architektur.

An sich ja, es geht hier aber doch eben darum dass man das mit einem GC eben nicht so drastisch muss. Und teilweise geht es auch darum ob dem nun so ist.
Als Notfallsystem, falls Programmierer aus Versehen oder aus purer Faulheit Zyklen eingebaut haben, weil sie sich eben nicht mit ihrem System und deren Komponenten zu sehr auseinandersetzen wollten. Oder weil sie schlicht unfähig waren, das kommt auch vor.

Naja Faulheit vorzuschieben finde ich nicht ganz korrekt. Ich denke wir sind uns alle einig dass es eine schöne Sache ist wenn eine Sprache oder ein Konzept einem Arbeit abnimmt. Sicher gibt es auch einige Entwickler die gerne sagen möchten "guck mal was ich ganz allein geschafft habe" aber im alltäglichen Arbeitsleben wird das wohl auf die wenigsten zutreffen. Wie großartig wäre es denn wenn man Software generieren könnte ohne sich Gedanken um irgendwelche Interna zu machen. Die Sache ist doch im allgemeinen, je weniger Gedanken sich ein Entwickler um technische Details machen muss desto mehr kann er sich auf den Inhalt der Software konzentrieren. Und je mehr einem vernünftig von der Technik abgenommen wird desto weniger Fehler kann der Mensch der die Technik nutzt doch in dem Bereich machen. Daran ist doch erst mal nichts schlecht.
Und hier treffen jetzt eben die Welten aufeinander die behaupten dass ein GC dabei eben eine Hilfe ist, bzw dass ein GC einfach nur hinderlich ist. Die Faulheit eines Entwickler ist aber doch nur so lange schlimm wie er sich die nicht leisten kann. Wir müssen uns ja auch um vieles keine Gedanken mehr machen seit dem es hohe Sprachen gibt. Oder seitdem es von mir aus vernünftige Assembler gibt oder noch tiefer angesetzt.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

105

20.05.2016, 16:21

Auf nichts, wieso?
Mir kam es so vor, als würdest Du denken, dass PHP keinen GC verwendet. Denn Du hast auf eine Frage geantwortet, die sich auf mit RC zykl. Abhängigkeiten bewältigen ohne GC bezogen hat. Als ich darauf geantwortet habe, habe ich den Eindruck gewonnen, Du würdest den Einsatz vom GC bei PHP weniger wichtig sehen, weil das ja nur eine Notlösung wäre und eigentlich nur RC wäre. Das ist aber für diese Diskussion irrelevant, da wir ja nicht darüber streiten welcher GC-Algorithmus denn der tollste ist. Da hab ich dann einfach mal nachgefragt.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

106

20.05.2016, 16:27

Mir kam es so vor, als würdest Du denken, dass PHP keinen GC verwendet. Denn Du hast auf eine Frage geantwortet, die sich auf mit RC zykl. Abhängigkeiten bewältigen ohne GC bezogen hat. Als ich darauf geantwortet habe, habe ich den Eindruck gewonnen, Du würdest den Einsatz vom GC bei PHP weniger wichtig sehen, weil das ja nur eine Notlösung wäre und eigentlich nur RC wäre. Das ist aber für diese Diskussion irrelevant, da wir ja nicht darüber streiten welcher GC-Algorithmus denn der tollste ist.

Ich hab' nur eine Lösung gezeigt, wie das in der realen Welt gelöst wird - also dass das anscheinend eben nicht ohne GC geht. ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

107

20.05.2016, 16:40

Nochmal: Der GC managed nicht Speicher allgemein, der GC managed nur Heapobjekte und sonst nichts. Und genau das ist das Problem...
Das sehe ich nicht so. In vielen Fällen ist die Anzahl der extern verwendeten Ressourcen irrelevant. Transaktionen und Datenbankzugriffe werden wegabstrahiert.

Also mir fällt gerade keine ernste Anwendung ein, die ohne sogenannte "externe Ressourcen" wie Dateien, Sockets etc. auskommt. Schön wie die eigentlichen Probleme immer einfach wegabstrahiert werden und damit plötzlich aufhören, zu existieren... Das beantwortet halt leider nicht die Frage, wie genau diese Abstraktion sich nun um ihre Ressourcen kümmern soll. Und genau da sind wir wieder beim Punkt: GC macht es unheimlich schwer genau solche Abstraktionen überhaupt erst zu bauen...


Vielleicht geht es ja um einen Konflikt, den Rasmus Lerdorf (Erfinder von PHP) mal beschrieben hat:

Zitat

* I actually hate programming, but I love solving problems.
* There are people who actually like programming. I don’t understand why they like programming.
* I’m not a real programmer. I throw together things until it works then I move on. The real programmers will say “Yeah it works but you’re leaking memory everywhere. Perhaps we should fix that.” I’ll just restart Apache every 10 requests.
Bei so einer Einstellung ist man mit einer GC-Sprache deutlich besser dran.

Mit so einer Einstellung sollte man besser die Finger vom Programmieren lassen. Sorry, aber wenn deine sogenannte "Lösung" eines Problems das Problem nur unter unbeschränktem Ressourceneinsatz bewältigt, dann hast du das Problem nicht gelöst, Ende der Diskussion. Eine wirklich einzigartige Kombination von Arroganz und Ignoranz, die dieser Herr Lerndorf da an den Tag legt...

Mir geht es nicht so wie Lerdorf, aber ich hasse es mich um technische Details zu sorgen, die ich auch automatisch machen lassen kann. Ich will möglichst abstrakt arbeiten.

Abstrakt arbeiten hat aber nichts mit GC zu tun. Man kann ohne GC sogar wesentlich besser abstrakt arbeiten, weil man sich noch wesentlich abstrakter ausdrücken kann, wenn man sich in seinen Abstraktionen solch fundamentaler Konzepte wie dem von Scope bedienen kann. Das ist aber halt leider etwas, das man erst sehen kann, wenn man es mal ernsthaft betrieben hat und dann auf einmal wieder ohne leben musste...

Hast du da ein Beispiel? Ich wüsste nicht, von was du da gerade redest. Ich hab noch keine große managed Anwendung gesehen, bei der mir spontan das Wort "robust" eingefallen wär...

Naja es gibt viele Ports von Java Framework auf C++, die Performance in den Vordergrund stellen und damit aber anfälliger sind. Am besten ist einfach, sowas aufzuprobieren. Ich rede aber meist von eher internen Systemen, daher wirst du kaum was damit anfangen können. Deswegen ist es eben auch einfach Erfahrung. Wenn du wirklich meinst eine große Anwendung in C++ wäre robuster, im Sinne der Verfügbarkeit, gegen ein managed Anwendung, dann sei das eben so. Das ist halt dann dein subjektiver Eindruck. Wenn du eben für alles C++ nimmst, dann kannst du das halt auch nicht sehen. Mein Eindruck ist eben anders.

Du willst also nun argumentieren, dass managed Sprachen "robuster" sind, weil es irgendwelche Ports irgendwelcher managed Frameworks, die niemals für C++ designed wurden, gibt, die nicht so toll "robust" sind? Sry, da fällt mir keine gute Antwort drauf ein, ich lass das einfach mal für sich selbst sprechen... :D
In der echten Welt ist GC in Anwendungen, die Robustheit erfordern – wie z.B. Software für Avioniksysteme – inzwischen natürlich absolut nicht mehr wegzudenken, da deterministisches Verhalten da absolut inakzeptabel wäre... ;)

Kennt ihr denn eine Sprache ohne GC, die so eine tolle Standardbibliothek mitbringt?

Dass Java und .Net eine tolle Standardbibliothek haben bestreitet keiner. Diese Tatsache hat aber überhaupt nichts damit zu tun, dass diese Sprachen auf GC basieren. Python hat auch eine tolle Standardbibliothek, ganz ohne dass dazu ein GC nötig wäre...

108

20.05.2016, 16:44

Python hat auch eine tolle Standardbibliothek, ganz ohne dass dazu ein GC nötig wäre...
Ähm, nutzt Python keinen GC?

109

20.05.2016, 16:53

In der echten Welt ist GC in Anwendungen, die Robustheit erfordern – wie z.B. Software für Avioniksysteme – inzwischen natürlich absolut nicht mehr wegzudenken, da deterministisches Verhalten da absolut inakzeptabel wäre...
Das ist nicht zielführend, wenn Du den Begriff Robustheit, wie er hier verwendet wurde, so absichtlich fehlinterpretierst. Im Sinne der Qualitätsmerkmale nach ISO 9126 meinte LetsGo "Wartbarkeit/Änderbarkeit" und "Zuverlässigkeit". Und bei Zuverlässigkeit ganz sicher keine kritischen Echtzeitsysteme. Dass man da mit einem GC schon konzpetionell Probleme kriegen kann, bestreitet niemand.

Das beantwortet halt leider nicht die Frage, wie genau diese Abstraktion sich nun um ihre Ressourcen kümmern soll. Und genau da sind wir wieder beim Punkt: GC macht es unheimlich schwer genau solche Abstraktionen überhaupt erst zu bauen...
Genau dafür sind unter anderem Non-GC-Sprachen super. Und darüber hinaus stellen ja auch GC-Sprachen Mittel bereit mit Ressourcen umzugehen. Das sind aber Stellen, die man nach Möglichkeit abstrahieren sollte. Und das wird ja auch fleißig getan.

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »Chromanoid« (20.05.2016, 17:03)


dot

Supermoderator

  • »dot« ist der Autor dieses Themas

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

110

20.05.2016, 17:02

Python hat auch eine tolle Standardbibliothek, ganz ohne dass dazu ein GC nötig wäre...
Ähm, nutzt Python keinen GC?

Nun, ursprünglich hatte Python keinen GC, mittlerweile ist es der Implementierung überlassen, einen GC zu verwenden. CPython (die Referenzimplementierung der Sprache) verwendet Reference Counting und hat damit deterministische Lebensdauern, der GC ist unabhängig und optional (allerdings on by default) und dient zur Auffindung von Zyklen. Der Sprachstandard garantiert strenggenommen aber leider keine deterministischen Lebensdauern, das ist richtig. Ist aber auch nicht so wichtig, der eigentliche Punkt war ja, dass GC nichts mit der potentiellen Qualität der Standardbibliothek einer Sprache zu tun hat...

Werbeanzeige