Wozu braucht man Reflection?
-
Wikipedia ist natuerlich unter allen Umstaenden zu 100% richtig.
-
Zeus schrieb:
Das ist natürlich Unsinn. Zeig mit eine dynamisch instanzierte Template. Lad mal ein Template in oder aus ein Vector. Ops.
Templates sind ein reiner Compiletime-Mechanismus, ueberrascht dich das jetzt?
-
Compiletime Reflection ist natuerlich ein sehr maechtiges Werkzeug - aber natuerlich auch etwas anderes als Runtime Reflection.
Compiletime Reflection ermoeglicht zB solche Sachen wie virtual and und abdrehen, oder die Kopierkosten bei Funktionsaufrufen zu optimieren.
Einfach mal googlen. Denn hierbei hat Kellerautomat komplett recht.
Ein Blick auf Scala waere hier zB ganz interessant (um nicht immer bei C++ zu bleiben).
-
Shade Of Mine schrieb:
Compiletime Reflection ist natuerlich ein sehr maechtiges Werkzeug - aber natuerlich auch etwas anderes als Runtime Reflection.
Compiletime Reflection ermoeglicht zB solche Sachen wie virtual and und abdrehen, oder die Kopierkosten bei Funktionsaufrufen zu optimieren.
Einfach mal googlen. Denn hierbei hat Kellerautomat komplett recht.
Ein Blick auf Scala waere hier zB ganz interessant (um nicht immer bei C++ zu bleiben).
Entschuldigung Shade, aber das ist Unsinn. Wenn mein über Teilsysteme redet:
Compiletime Reflection vs Runtime Reflection und implizit das ganze System(Programmiersprache) einbindet, dann ist es wohl C++ vs Java. Dabei könnte ich wohl auch über Scala oder ObjectiveC gemeint haben. Außerdem schmeißt Scala die Runtime Relection auch nicht über Board, obwohl die Compiletime Reflection sehr mächtig ist. Wir können aber auch bei den Apfel und Birnen Vergleich bleiben und uns fragen wieso C++ keine CTFE hat, obwohl es ein sehr viel mächtigere ist - ach lieber nicht.
-
Es ist kein Entweder/Oder sondern einfach eine Mechanik. Genauso wie Ueberladung und Ableitung Mechaniken sind, die du in einer Sprache einsetzen kannst.
Scala kann sowohl Runtime Reflection als auch Compiletime Reflection.
Bei Reflection geht es lediglich darum Typinformationen auszulesen und diese irgendwie zu verarbeiten. In C++ hast du zB ein template dass nichts ueber seinen Typen weiss den es als Parameter bekommt.
Stell dir zB folgende Situation vor: du hast ein Objekt und willst wissen ob du hier die operation Foo aufrufen kannst - dass ist zB ein standardfall fuer Reflection.
Nun stell dir ein C++ Template vor, dass wissen will ob der uebergebene Typ die Operation Foo unterstuetzt.
Baem - 1:1 die selbe Situation. Man verwendet in C++ compiletime reflection einfach nur natuerlicher als man es mit Runtime Reflection macht. So braucht man fuer Runtime Reflection eine eigene Reflection Klasse oder dergleichen und ploetzlich sagt jeder: ja das ist Reflection. Aber dynamic_cast ist zB auch runtime reflection - nur eben als Sprachmittel eingebaut.
Und genauso funktioniert Compiletime Reflection. Du hast einen Typ ueber den du Informationen bekommen willst. Ist die Operation Foo supportet? Kann ich es serialisieren, etc. Weiters kann man auch Parametisiert Funktionen aufrufen. Einen grossteil der Sachen die man mit Runtime Reflection macht, kann man auch zur Compiletime machen.
Aber es steht halt nicht gross Reflection drauf. Vielleicht magst du den Begriff "Compiletime Metaprogramming" mehr als "Compiletime Reflection"?
-
Sorry Shade ich seh kein Zusammenhang zu mein Post. Daher lass ich lieber irgendetwas zu sagen, weil es eh sinnlos sein würde.
-
Shade Of Mine schrieb:
Aber dynamic_cast ist zB auch runtime reflection - nur eben als Sprachmittel eingebaut.
In computer science, reflection is the ability of a computer program to examine (see type introspection) and modify the structure and behavior (specifically the values, meta-data, properties and functions) of an object at runtime.
-
Zeus:
Ehrlich gesagt verstehe ich bei Deinen Posts die Zusammenhänge generell nicht. Du sagst "Das ist Schwachsinn" oder "Das ist Unsinn", sagst aber nicht, worauf es sich bezieht und an der Begründung nach dem ersten Satz kann ich nicht ablesen, wo da der Zusammenhang zum Satz davor besteht. Die Grammatikfehler helfen mir da auch nicht weiter. Vielleicht hat Shade of Mine Dich deswegen missverstanden?Mal unabhängig von euren Wortschlachten. Die Java-Reflection ist doch einfach Mal ausgeprägter als die in C++, egal wie man es nennt.
In C++ kann ich mir eben nicht die Attribute/Methoden einer Klasse auflisten lassen. Ich kann prüfen, ob foo() existiert, aber nicht eine Liste erhalten. Genau das wäre aber für eine allgemeine Serialization-Funktionalität notwendig. Und über XML-Dateien Abhängigkeiten einzupflanzen, die dann Dependency Injection (Diskussionsfall für sich, ob man das braucht) erlauben und viele weitergehende Mechanismen nutzen, weben das von "omg..." zitierte Feature des "modify class at runtime" an.
-
Reflection ist ein Java-Müll den keiner braucht, aber wenn es in C++ irgendwann kommt, ist es das beste wo gibt.
-
Zusammengefasst schrieb:
Reflection ist ein Java-Müll den keiner braucht, aber wenn es in C++ irgendwann kommt, ist es das beste wo gibt.
Ich denke, dass Compiletime Reflection viel wichtiger ist als Runtime Reflection. Damit kann ich mir naemlich memberweise Vergleichsoperatoren oder Serialisierungsroutinen automatisch generieren lassen. Oder wie waere es mit einer GUI-View, die fuer meine Klasse generiert wird.
-
Ich denke, dass Runtime Reflection den Grundprinzipien einer statisch stark typisierten Sprache widerspricht...
-
Kellerautomat schrieb:
Ich denke, dass Compiletime Reflection viel wichtiger ist als Runtime Reflection. Damit kann ich mir naemlich memberweise Vergleichsoperatoren oder Serialisierungsroutinen automatisch generieren lassen. Oder wie waere es mit einer GUI-View, die fuer meine Klasse generiert wird.
Geht alles mit Runtime Reflection.
-
ja und... schrieb:
Kellerautomat schrieb:
Ich denke, dass Compiletime Reflection viel wichtiger ist als Runtime Reflection. Damit kann ich mir naemlich memberweise Vergleichsoperatoren oder Serialisierungsroutinen automatisch generieren lassen. Oder wie waere es mit einer GUI-View, die fuer meine Klasse generiert wird.
Geht alles mit Runtime Reflection.
Jau, ganz toll. Dann fragst du jedes einzelne Objekt, wie es aufgebaut ist, oder wie?
Es geht darum, zur Compilezeit bereits Code generieren zu koennen, sodass gar kein Overhead mehr vorhanden ist.
-
Kellerautomat schrieb:
ja und... schrieb:
Kellerautomat schrieb:
Ich denke, dass Compiletime Reflection viel wichtiger ist als Runtime Reflection. Damit kann ich mir naemlich memberweise Vergleichsoperatoren oder Serialisierungsroutinen automatisch generieren lassen. Oder wie waere es mit einer GUI-View, die fuer meine Klasse generiert wird.
Geht alles mit Runtime Reflection.
Jau, ganz toll. Dann fragst du jedes einzelne Objekt, wie es aufgebaut ist, oder wie?
Da braucht man schon nen Quantencomputer um so ne GUI aufzubauen.
-
reflection is slow as fuck
-
english guest schrieb:
reflection is slow as fuck
like Java
-
Reflection setzt man ja auch nicht in performancekritischem Code ein...
-
Eisflamme schrieb:
Reflection setzt man ja auch nicht in performancekritischem Code ein...
like Java
-
Das einzige was ich ueber Compiletime Reflection hier gelernt habe, ist der Post von Shade, wo es gleichgesetzt wird mit Compiletime Metaprogramming. Wenn dem so ist, warum wird dann hier so ein Fass aufgemacht? Ist dem so?
@Kellerautomat: Nun, ich kenne Scala nicht, aber dafuer Scheme sehr gut, insbesondere das Makrosystem. Damit damit kann ich zur Kompilezeit und Laufzeit Code generieren. Meinst du sowas?
-
Ich würde mir das Template-System von C++ kombiniert mit dem Code-Generator von D wünschen. Wo passive Code-Generierung (aka. templates) hilft, finde ich templates ja gut, aber wo man mit templates auf Compile-Time-Rekursionen ausweichen muss, gehen sie mir streckenweise doch sehr stark auf den Sack.
Geil finde ich auch die Jungens, die eine variable Liste von Template-Parametern so in Typ-Listen und MPL-Compile-Time-Suche aufdröseln, dass man die Paramater in beliebiger Reihenfolge angeben kann. Keine Sau braucht sowas, aber die Compiler und unbedarften Programmierer schwitzen über Jahrzehnte an diesen Konstrukten... Einfach lächerlich...
Keine Ahnung, was das jetzt mit dem Thema zu tun hat, aber bei Templates gehts mit mir immer los.