Introspektion und Reflexion



  • In Java gibt es ja die Moeglichkeit der Introspektion und Reflexion.
    Warum gibt es das (AFAIK) in C++ nicht?



  • Raptor schrieb:

    In Java gibt es ja die Moeglichkeit der Introspektion und Reflexion.
    Warum gibt es das (AFAIK) in C++ nicht?

    Erstmal zur Abgrenzung der Begriffe:

    Bei Reflection geht es darum, die Struktur von Klassen usw. zur Laufzeit zu untersuchen und dynamisch zu nutzen, sowie entsprechende Informationen über Objekte zu erhalten und zu nutzen.

    Bei Introspektion geht es darum, bestimmte Codestücke zur Laufzeit zu verändern. Dies kann besipielsweise von Profilern genutzt werden. Natürlich ist Introspektion sehr an Reflection gebunden. Ohne Reflection gibt es keine Introspektion.

    Wenn du solche Daten aber zur Laufzeit erhalten möchtest, dann müssen die auch vorhanden sein. Hier ist das Hauptproblem von C++: Die Daten werden einfach nicht in dem Maß in das Kompilat übernommen, wie das bei Java der Fall ist. Man möchte in C++ halt nicht für jedes Objekt 8 Byte spendieren, damit die ID der Klasse mitgeschleppt wird und so weiter. Das war's. Ist ein ganz einfacher Grund. Enttäuscht?! 😃



  • Bin mir jetzt nicht ganz sicher, aber ich glaube, du hast die Begriffe bei der Erklaerung vertauscht. Das ist dann also auch der Grund, warum Klassen in Java Objekte sind, in C++ aber nicht, oder?

    Eine weitere Frage:
    Java bietet ja die Moeglichkeit, Klassen(nicht Objekte!) dynamisch zu laden.
    Warum bietet C++ diese Moeglichkeit (AFAIK)nicht? Haengt das mit der Introspektion und Reflektion zusammen?



  • Raptor schrieb:

    Bin mir jetzt nicht ganz sicher, aber ich glaube, du hast die Begriffe bei der Erklaerung vertauscht. Das ist dann also auch der Grund, warum Klassen in Java Objekte sind, in C++ aber nicht, oder?

    Ups, ich habe gerade Introspection mit Instrumentation verwechselt. 😃 ...kann ja mal vorkommen. 🙂



  • Raptor schrieb:

    Das ist dann also auch der Grund, warum Klassen in Java Objekte sind, in C++ aber nicht, oder?

    Klassen sind auch in Java keine Objekte. Man hat in Java aber Objekte, die Klassen repräsentieren. ...also eine Klasse Class, deren Instanzen jeweils eine bestimmte Klasse repräsentieren. Das ist sicherlich notwendig, um Reflection halbwegs vernünftig zu implementieren und nutzen zu können.

    Raptor schrieb:

    Eine weitere Frage:
    Java bietet ja die Moeglichkeit, Klassen(nicht Objekte!) dynamisch zu laden.
    Warum bietet C++ diese Moeglichkeit (AFAIK)nicht? Haengt das mit der Introspektion und Reflektion zusammen?

    Die Daten sind im Kompilat nicht vorhanden -> geht nicht. ...und wäre ohne Reflection unnütz.



  • Danke fuer deine Antworten.
    Wird zu erwarten sein, dass z.B. Features wie Introspektion, Reflektion, dynamische Klassen, Klassen als Objekte auch irgendwann mal in C++ implementiert sein werden?
    Ich muss naemlich zugeben, dass ich diese Features nicht ganz unnuetz finde und sogar behauopten wuerde, dass Java C++ in diesen Aspekten ueberlegen ist.



  • Raptor schrieb:

    Wird zu erwarten sein, dass z.B. Features wie Introspektion, Reflektion, dynamische Klassen, Klassen als Objekte auch irgendwann mal in C++ implementiert sein werden?

    Rechne mal nicht damit. Das hat ja auch alles negative Aspekte, die man nicht vergessen sollte. Wenn man pro Objekt 8 weitere Bytes spendieren muss, dann ist das aus Performance-Sicht eine mittlere Katastrophe. ...und das ist nur ein Aspekt. Bei C++ hat man sich halt dafür entschieden, einen anderen Weg zu gehen und das ist auch nicht schlecht. Beide Ansätze haben ihre Vorteile und Nachteile. Du kannst nicht erwarten, dass eine Sprache in allen Aspekten allen anderen Sprachen überlegen ist. Überleg dir halt, was du für dein konkretes Projekt für wichtig hälst und entscheide dich anhand dessen für eine Sprache.


Log in to reply