GObject Introspection
Note: GObject Introspection is still in development - the first stable release was released with GTK+ 3.
Table of contents:
Contents
Goals
The introspection project has two major goals, and a variety of more minor ones.
Two level applications - C and <your favorite runtime>
It makes sense to build many kinds of applications using (at least) two different levels and languages. Those being C+GObject, and a managed (GC'd) runtime. C is good for graphics, multimedia, and lower level systems work. However, writing complex software is difficult and error-prone without garbage collection. A managed runtime such as Vala, JavaScript, Python, Java, Lua, .NET, Scheme etc. makes a lot of sense for non-fast-path application logic such as configuration, layout, dialogs, etc.
Note: to use this goal you need to write your code using GObject convention. if you don't know about gobject please see here
Thus, one of the major goals of the GObject introspection project is to be a convenient bridge between these two worlds, and allow you to choose the right tool for the job, rather than being limited inside one or the other. With the introspection project, you can write for example a ClutterActor or GtkWidget subclass in C, and then without any additional work use that class inside JavaScript.
Sharing binding infrastructure work, and making the platform even more binding-friendly
Historically in GNOME, the core platform has been relatively binding-friendly, but there are several details not captured in the C+GObject layer that bindings have needed. For example, reference counting semantics and the item type inside GList's. Up until now various language bindings such as Python, Mono, java-gnome etc. had duplicated copies of hand-maintained metadata, and this led to a situation where bindings tended to lag behind until these manual fixups were done, or were simply wrong, and your application would crash when calling a more obscure function.
The introspection project solves this by putting all of the metadata inside the GObject library itself, using annotations in the comments. This will lead to less duplicate work from binding authors, and a more reliable experience for binding consumers.
Additionally, because the introspection build process will occur inside the GObject libraries themselves, a goal is to encourage GObject authors to consider shaping their APIs to be more binding friendly from the start, rather than as an afterthought.
Additional goals and uses
- API verification - Sometimes the API of a library in our stack changes by accident. Usually by a less experienced developer making a change without realizing it will break applications. Introspecting the available API in each release of the library and comparing it to the last one makes it easy to see what changed
Documentation tools - The tools written inside of the GObjectIntrospection can easily be reused to improve that problem. Essentially; replacing gtk-doc. We want to document what we export so it makes sense to glue this together with API verification mentioned above (see BindingsDocumentation)
- UI Designer infrastructure
- Serialization/RPC/DBus
Using GI
General Example Step by Step
GObjectIntrospection/FromHereToThere is a tutorial on how to use the introspection system to create multilevel (polyglot) applications
https://github.com/antono/vala-object - Use single GObject function from your favorite language
Annotation System
GObjectIntrospection/Annotations Annotation documentation
Convention
http://developer.gnome.org/gobject/2.30/gtype-conventions.html
Integrate GI in Autotools
GObjectIntrospection/AutotoolsIntegration How to integration your library's build system with gobject-introspection
Applications and Languages Bindings
GObjectIntrospection/Users Language bindings and Applications using GObjectIntrospection
Write a Language Bindings
GObjectIntrospection/HowToWriteALanguageBinding How to write an introspection binding for your language
Write Bindable API
GObjectIntrospection/WritingBindingableAPIs is a set of best practices on writing C libraries to be easily bindable
Who is using GI
GnomeGoals/AddGObjectIntrospectionSupport Upstream status of introspection
Architecture
GObjectIntrospection/Architecture ASCII-art diagram showing how things fit together
Contents of the package
It provides:
- An XML format called GIR containing introspection information
- Python package to create and parse the GIR format
- scanner to generate GIR format from C source and headers
- a typelib similar to xpcom/msole which stores the information on disk in a binary format
- a compiler to compile the typelib from a xml format (and vice versa)
- C library to read the typelib
Getting the code
The latest stable release is available from download.gnome.org
GObject Introspection is now stored in git and can be fetched:
git clone git://git.gnome.org/gobject-introspection
CGit link: http://git.gnome.org/cgit/gobject-introspection/tree/
GIR files are available in their respective modules.
Reporting bugs
Follow this link: https://bugzilla.gnome.org/enter_bug.cgi?product=glib&component=introspection
Contact
- For questions or additional information, please use:
Mailing list: gtk-devel-list@gnome.org
- IRC: #introspection on irc.gnome.org