web-dev-qa-db-fra.com

Que signifie "Introspection" et en quoi est-il lié à GObject Introspection?

Qu'est-ce que l'introspection signifie exactement? Comment est-ce utile pour un programmeur? Quelqu'un peut-il s'il vous plaît expliquer en termes simples?

8
niagr

L'introspection permet de déterminer ce qu'est un objet et ce qu'il contient au moment de l'exécution. Dans certaines langues, cela est plus nécessaire que d'autres. Python qui est typé de manière dynamique (c'est-à-dire qu'un objet peut gagner des attributs et des méthodes au moment de l'exécution) utilise l'introspection pour connaître le statut actuel d'un objet.

Voici un exemple très simpliste Python dans lequel vous commencez avec une classe et ajoutez un nouvel attribut, puis, en utilisant l'introspection, contrôlez quels attributs sont disponibles sur l'instance d'objet.

>>> class MyObject:
...   variable = False

>>> instance = MyObject()

>>> dir(instance)
['__doc__', '__module__', 'variable']

>>> instance.newvariable = "Kittens"

>>> dir(instance)
['__doc__', '__module__', 'newvariable', 'variable']

Ainsi, dans les systèmes dynamiques, vous pouvez utiliser des éléments tels que hasattr de Python pour indiquer si un objet sera capable de faire ce que vous essayez de faire avec. Même si vous ne l'utilisez pas au moment de l'exécution, l'introspection est également extrêmement utile pour le débogage.


Passons maintenant à GObjects et aux bibliothèques basées sur GObject. Ils sont en C et en C, vous n'obtenez pas toutes ces absurdités de code géré duveteuses, vous obtenez des performances. Cela signifie que l'introspection intégrée n'existe pas et qu'il est donc plus difficile de maintenir une liaison externe.

Bindings sont une API entre des choses dans différentes langues qui leur permettent de travailler ensemble. Pour que cela fonctionne, vous avez besoin d'une API commune et, dans ce cas, cette API est GObject. Mais pour que cela fonctionne, l'appelant doit savoir ce qui est disponible. Jusqu'à GObject Introspection, cela devait être codé en dur dans les liaisons, ce qui signifie qu'il faut conserver une liste manuscrite pour chaque ensemble de liaisons.

GObject Introspection fournit essentiellement un scanner capable de parcourir la source actuelle de GObject avec lequel vous travaillez et vous fournit des informations sur les liaisons XML. Ceci est ensuite traité par les liaisons et vous vous retrouvez avec une API qui fonctionne, tout le temps.

Je n'ai certes pas tout couvert ici, mais j'essaie de vous donner une idée des deux sujets (l'introspection et pourquoi les objectifs de GO en ont besoin). Si vous voulez en savoir plus, vous en trouverez de nombreuses sur le site Web de Gnome.

11
Oli