Wozu braucht man Reflection?
-
Wozu braucht man Reflection?
-
Wozu braucht man Autos, Kutschen waren doch auch gut. Stelle bitte eine konkrete Frage!
-
C++ kann keine Reflection, bin ich damit im Nachteil gegenüber Javalern?
-
relfector schrieb:
C++ kann keine Reflection, bin ich damit im Nachteil gegenüber Javalern?
Ja und Java ist im Nachteil weil es keine Templates hat
-
relfector schrieb:
C++ kann keine Reflection, bin ich damit im Nachteil gegenüber Javalern?
Hängt wohl davon ab, was genau du machen willst. Wofür meinst du denn, Reflection zu brauchen?
-
dot schrieb:
relfector schrieb:
C++ kann keine Reflection, bin ich damit im Nachteil gegenüber Javalern?
Hängt wohl davon ab, was genau du machen willst.
Was woll, einen Java vs. C++ Flamewar.
-
Reflection ist für manche Sachen ganz nett.
Angenommen du hast z.B. eine Klasse
class Person { String name; int age; }
Dann kannst du dir Funktionen schreiben, die dir alle Variablen in der Klasse auflistet, und dir den Wert setzen lässt, ohne daß du die eigentliche Klasse kennen musst. Auf die Weise kannst du z.B. eine Klasse schreiben, die dir beliebige Objekte in Dateien serialisieren kann. Oder man kann irgendwelche Plugin-Mechaniken damit realisieren.
Ein paar Beispiele in Pseudo-Code:
myObject.getClass().getField("name").setValue("...");
IPlugin plugin = Class.forName("com.xy.plugin.SamplePlugin").newInstance();Wenn man auf sowas angewiesen ist, hat man mit Java natürlich einen Vorteil.
Ein paar Funktionen kann man sich aber zur Not auch in C++ zusammenfaken.
-
Java's Reflection ist ja 'n Witz. Richtig interessant wirds erst mit Compiletime Reflection & Code generierung, die wir hoffentlich bis C++17 bekommen. Dann koennen die Java-programmierer scheissen gehen.
-
Kellerautomat schrieb:
Java's Reflection ist ja 'n Witz. Richtig interessant wirds erst mit Compiletime Reflection & Code generierung, die wir hoffentlich bis C++17 bekommen. Dann koennen die Java-programmierer scheissen gehen.
Life is too short to program in C++ - das bewahrheitet sich immer wieder aufs Neue.
-
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.