Quelle est la différence entre introspection et réflexion?

est-ce que quelqu'un peut expliquer, d'un point de vue langagier/environnemental, la différence entre ces deux notions?

Existe-t-il également un ensemble de conditions que les langages de programmation doivent respecter pour être réfléchissants et/ou introspectifs?

et s'il y en a, Quelles sont ces conditions?

34
demandé sur U r s u s 2014-08-08 11:37:29

3 réponses

L'article de Wikipedia a un bon résumé:

En informatique, type de réflexion est la capacité d'un programme à examiner le type ou les propriétés d'un objet lors de l'exécution. Certains langages de programmation possèdent cette capacité.

Introspection ne doit pas être confondu avec réflexion, qui va un peu plus loin et est la possibilité pour un programme de manipuler les valeurs, les méta-données, les propriétés et/ou les fonctions d'un objet à Runtime. Certains langages de programmation, par exemple Java, possèdent également cette capacité.

Prendre un statiquement typé, programme compilé:

SomeType function foo(int i) {
    return new SomeType(i);
}

tous les types sont connus et appliqués au moment de la compilation, le programme ne devrait même pas compiler s'il ne satisfait pas ses propres contraintes de type explicites. Les langages de programmation dynamique ne présentent généralement pas ce genre de rigidité, les types de variables ne sont pas nécessairement connus au moment de la compilation. Ils peuvent ressembler à ceci:

function foo(i) {
    return new SomeType(i);
}

La fonction ne peut pas garantir qu' i est exactement, il est juste de passage. Cela peut ou ne peut pas causer des problèmes quelque part, le système de type ne peut pas aider ici. Ce type de vérification des erreurs est alors généralement relégué au code userland, pour lequel un tel code a besoin de capacités d'introspection:

function foo(i) {
    if (!is_int(i)) {
        throw new InvalidArgumentException;
    }
    return new SomeType(i);
}

où exactement tracer la ligne entre introspection et réflexion est quelque peu discutable. On peut dire que l'introspection est tout ce qui permet code à test qu'est-ce que quelque chose est ("Qu'est-ce que je suis?"), alors que la réflexion est la capacité de manipuler la structure du programme lui-même. Par exemple, un exemple PHP:

$ref = new ReflectionClass('Foo');
$foo = $ref->newInstanceWithoutConstructor();

le code ci-dessus contourne l'exécution du constructeur de classe Foo lors de la création d'une nouvelle instance. C'est de la manipulation de code à l'exécution. Dans la pratique cependant, L'API de réflexion en PHP contient également des fonctionnalités d'introspection. Certaines de ces capacités sont un double de ce qui peut être fait avec capacité d'introspection "inférieure". E. g.:

$ref = new ReflectionClass($obj);
if ($ref->getName() == 'Foo') ...

if ($obj instanceof Foo) ...

les deux extraits font essentiellement la même chose, mais l'un utilise la réflexion et l'autre ce qu'on appelle l'introspection. Comme vous le voyez, il n'y a pas de ligne de démarcation claire. Cependant, la réflexion est généralement plus puissante que l'introspection. Par exemple, en PHP, vous devez utiliser L'API de réflexion pour obtenir des informations sur les types d'arguments qu'une fonction accepte. C'est juste une introspection "passive", mais qui appartient à la réflexion API. C'est surtout une question de mise en œuvre pratique.

en bref, par définition générale, pour être introspectif un programme doit être capable d'examiner des parties de lui-même à l'exécution et d'exécuter du code différent basé sur cette information. Un programme réfléchissant au-delà de cela peut changer ses propres règles d'exécution de code à l'exécution, par exemple en optant pour ne pas invoquer un constructeur, qui est par ailleurs une opération obligatoire telle que définie par la langue.

28
répondu deceze 2014-08-08 08:38:48

Type introspection:

capacité d'un langage de programmation À examiner le type ou les propriétés d'un objet à l'exécution.

Exemple (Java):

String myObj1 = new String();
MyCustomObject myObj2 = new MyCustomObject();
if(myObj2 instanceof MyCustomObject) {
    System.out.println("This is an example of type interospection");
}



Réflexion:

capacité d'un langage de programmation à réaliser des choses inférieures à l'exécution.

  • Type de l'introspection (comme vu ci-dessus)
  • Examiner et modifier un objet.
  • et beaucoup plus
1
répondu dheeran 2017-09-18 20:11:47

Réflexion est un mécanisme composé de deux techniques :

  1. Introspection

    La capacité d'un programme à l'examiner lui-même

  2. Intercession

    la capacité pour un programme de se modifier (son comportement ou son état)

Réf. https://fr.wikipedia.org/wiki/R%C3%A9flexion_(informatique)#Introspection_et_intercession

ma référence est une page française parce que la page anglaise ne fait pas référence directement au terme intercession.

1
répondu csblo 2017-10-05 13:02:58