Wozu braucht man Reflection?
-
Kellerautomat schrieb:
Compiletime Reflection
Den Ausdruck hast jetzt hoffentlich du erfunden und nicht C++ Marketing Typen. Bei Reflection geht es doch genau darum, dass das Programm zur Laufzeit seine eigente Struktur ändert und nicht der Compiler.
-
omg.... schrieb:
Kellerautomat schrieb:
Compiletime Reflection
Den Ausdruck hast jetzt hoffentlich du erfunden und nicht C++ Marketing Typen. Bei Reflection geht es doch genau darum, dass das Programm zur Laufzeit seine eigente Struktur ändert und nicht der Compiler.
Nein?! Bei Reflection geht es darum, dass ein Programm Typ-Informationen ueber sich selbst erfahren kann. (aka reflektieren)
Ob das zur Compilezeit oder zur Laufzeit passiert, ist erstmal voellig egal. Wenn man aber die Informationen zur Compilezeit hat, kann man sie genauso zur Laufzeit zur Verfuegung stellen. Folglich ist Compiletime Reflection ein vieeeeeeeeeeel maechtigeres Tool.
-
Kellerautomat schrieb:
omg.... schrieb:
Kellerautomat schrieb:
Compiletime Reflection
Den Ausdruck hast jetzt hoffentlich du erfunden und nicht C++ Marketing Typen. Bei Reflection geht es doch genau darum, dass das Programm zur Laufzeit seine eigente Struktur ändert und nicht der Compiler.
Nein?! Bei Reflection geht es darum, dass ein Programm Typ-Informationen ueber sich selbst erfahren kann. (aka reflektieren)
Ob das zur Compilezeit oder zur Laufzeit passiert, ist erstmal voellig egal. Wenn man aber die Informationen zur Compilezeit hat, kann man sie genauso zur Laufzeit zur Verfuegung stellen. Folglich ist Compiletime Reflection ein vieeeeeeeeeeel maechtigeres Tool.Das ist natürlich Unsinn. Zeig mit eine dynamisch instanzierte Template. Lad mal ein Template in oder aus ein Vector. Ops.
-
Kellerautomat schrieb:
omg.... schrieb:
Kellerautomat schrieb:
Compiletime Reflection
Den Ausdruck hast jetzt hoffentlich du erfunden und nicht C++ Marketing Typen. Bei Reflection geht es doch genau darum, dass das Programm zur Laufzeit seine eigente Struktur ändert und nicht der Compiler.
Nein?! Bei Reflection geht es darum, dass ein Programm Typ-Informationen ueber sich selbst erfahren kann. (aka reflektieren)
Ob das zur Compilezeit oder zur Laufzeit passiert, ist erstmal voellig egal. Wenn man aber die Informationen zur Compilezeit hat, kann man sie genauso zur Laufzeit zur Verfuegung stellen. Folglich ist Compiletime Reflection ein vieeeeeeeeeeel maechtigeres Tool.Das es nicht mächtiger ist hat ja Zeus schon gesagt und mit Reflection hat es zur Compiletime eigentlich sowieso nichts zu tun. http://en.wikipedia.org/wiki/Reflection_(computer_programming)
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.
Jeder Compiler gibt dem Programm z.B. mit einer v-Table Informationen über die Objekte. Compiletime Reflection ist einfach ein alberner Begriff.
-
Scheiße labern ist Kellerautomats zweite Vorhaut
-
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