O que significa “Introspecção” e como ela se relaciona com o GObject Introspection?

8

O que a introspecção significa exatamente? Como isso é útil para um programador? Alguém pode, por favor, explicar em termos leigos?

    
por niagr 27.02.2012 / 11:50

1 resposta

11

A introspecção é uma maneira de descobrir o que é um objeto e o que ele contém em tempo de execução. Em alguns idiomas isto é mais necessário que outros. Python que é digitado dinamicamente (isto é, um objeto pode ganhar atributos e métodos em tempo de execução) usa introspecção para descobrir o status atual de um objeto.

Aqui está um exemplo muito simplista do Python, onde você começa com uma classe e adiciona um novo atributo e, usando introspecção, monitora quais atributos estão disponíveis na instância do objeto.

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

>>> instance = MyObject()

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

>>> instance.newvariable = "Kittens"

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

Então, em sistemas dinâmicos, você pode usar coisas como hasattr do Python para dizer se um objeto será capaz de fazer o que você está tentando fazer com ele. Mesmo se você não usá-lo em tempo de execução, a introspecção também é extremamente útil para depuração.

Agora, nas bibliotecas GObjects e GObject. Eles estão em C e em C você não consegue todo esse absurdo adorável código gerenciado fofo, você obtém desempenho. Isso significa que a introspecção embutida não existe e isso significa que é mais difícil manter uma ligação externa.

Ligações são uma API entre coisas em diferentes idiomas que permitem que trabalhem juntas. Para que isso funcione, você precisa de uma API comum e, nesse caso, essa API é GObject. Mas para que isso funcione, a ligação do chamador precisa saber o que está disponível. Até o GObject Introspection, isso tem que ser codificado nas ligações e isso significa manter uma lista escrita à mão em cada conjunto de ligações.

O GObject Introspection essencialmente fornece um scanner que pode pesquisar a origem atual do GObject com o qual você está trabalhando e fornece informações de ligação XML. Isso é processado pelas ligações e você acaba com uma API que funciona, o tempo todo.

Eu certamente não cobri tudo aqui, mas estou tentando dar uma ideia dos dois tópicos (introspecção e por que o GObjects precisa disso). Se você quiser saber mais, há muito no site do Gnome.

por Oli 27.02.2012 / 12:21