web-dev-qa-db-ja.com

「Introspection」とは何を意味し、GObject Introspectionとどのように関連していますか?

イントロスペクションとはどういう意味ですか?プログラマにとってどのように役立ちますか?誰かが素人の言葉で説明してもらえますか?

8
niagr

イントロスペクションは、オブジェクトとは何か、実行時に含まれるものを見つける方法です。一部の言語では、これは他の言語よりも必要です。 Pythonは動的に型指定されます(つまり、オブジェクトは実行時に属性とメソッドを取得できます)は、イントロスペクションを使用してオブジェクトの現在のステータスを見つけます。

これは非常に単純なPythonの例で、クラスから開始して新しい属性を追加し、イントロスペクションを使用して、オブジェクトインスタンスで使用可能な属性を監視します。

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

>>> instance = MyObject()

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

>>> instance.newvariable = "Kittens"

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

したがって、動的システムでは、Pythonのhasattrのようなものを使用して、オブジェクトがあなたがしようとしていることを実行できるかどうかを判断できます。実行時に使用しない場合でも、イントロスペクションはデバッグに非常に役立ちます。


次に、GObjectsおよびGObjectベースのライブラリーに進みます。彼らはC言語であり、C言語では、この美しいふわふわしたマネージドコードのすべてをナンセンスにするわけではなく、パフォーマンスが得られます。これは、組み込みのイントロスペクションが存在しないことを意味し、外部バインディングを維持することがより困難であることを意味します。

Bindings は、異なる言語の物事の間のAPIであり、それらを連携させることができます。それが機能するためには、共通のAPIが必要です。この場合、そのAPIはGObjectです。しかし、これが機能するためには、呼び出し側バインディングは、利用可能なものを知る必要があります。 GObject Introspectionまでは、これをバインディングにハードコーディングする必要がありました。つまり、バインディングの各セットで手書きリストを維持する必要がありました。

GObject Introspectionは、基本的に、使用しているGObjectの現在のソースを検索できるスキャナーを提供し、XMLバインディング情報を提供します。その後、これはバインディングによって処理され、常に機能するAPIになります。

ここではすべてを取り上げたわけではありませんが、2つのトピック(イントロスペクションとGObjectsがそれを必要とする理由)について説明します。詳細を知りたい場合は、GnomeのWebサイトをご覧ください。

11
Oli