Обзор архитектуры и возможностей GObject Introspection
Antono Vasiljev, Koh-Tao, Thailand
LVEE Winter 2012
An overview of GObject Introspection architecture and use cases are given.
One of GObject Introspection main goals is to share binding infrastructure for making binding-friendly applications and libraries.
The introspection project solves this task by putting all of the metadata
inside the GObject library itself, using annotations in comments.
This decreases duplicated work for binding authors.
История и цели проекта
GObject Introspection – это проект, который возник для решения проблем
с созданием высокоуровневых языковых привязок (bindings) для библиотек GNOME. Долгое время все языковые привязки поддерживались вручную, и зачастую значительно отставали от библиотек1.
GObject Introspection – это технология, позволяющая создавать
автоматические языковые привязки для библиотек, использующих GLib и
GObject. Привязки могут создаваться как на этапе исполнения (через
FFI) так и на этапе сборки (с использованием компилятора привязок для
конкретного языка).
Для извлечения метаданных из библиотек используется система аннотаций в комментариях к функциям/методам.
Метаданные хранятся в бинарном формате typelib, обеспечивающем
быстрый доступ к библиотечным функциям через FFI. Для создания typelib-файла используется промежуточный формат GIR (GObject Introspection
Repository). GIR основан на XML, содержит информацию о вызове
функций и документацию API.
Архитектура
Этап сборки: +-----------------------------------------------------------+ | foo.c | | foo.h | | | | Исходный код библиотеки с анотациями | +-----------------------------------------------------------+ | | gcc g-ir-scanner | | | V | +------------------------+ | | Foo.gir | | | | | | <GI-name>.gir | | | | | | XML Файл | | | | | | Информация о вызовах | | | Зависимости | | | API документация | | | | | +------------------------+ | | | g-ir-compiler | | Рабочая система ----------------------------------------------------------- | | V V +-----------------------------+ +---------------------------+ | libfoo.so | | Foo.typelib | | | | | | | | Двоичная версия данных | | ELF файл | | о вызовах и зависимостях | | | | | | Машинный код и данные для | +---------------------------+ | динамического связывания | A | (DWARF debug data итп) | | +-----------------------------+ | A | | +---------------------------+ | | libgirepository.so | +-----------+ | | | libffi.so | | Умеет читать .typelib и | | |<-------+------>| представлять их в виде | +-----------+ | | пригодном для вызова | | | через FFI | | +---------------------------+ | | +----------------------------+ | Языковые привязки | +----------------------------+
Примеры использования
Я создал репозиторий2 с примерами использования библиотеки,
базирующейся на GObject, через автоматические привязки для разных языков.
Рассмотрим пример, использующий язык Vala для создания библиотеки и
обращения к этой библиотеке из Ruby:
namespace ValaObject { public void say_hello_to(string lang) { print(@"I love You, $lang!!!\n"); print("-- Vala\n\n"); } public class ValaClass : Object { public string name = "Vala Class"; public string append_to_name(string suffix) { return "%s %s".printf(name, suffix); } } }
Ruby использует метаданные из GIR через библиотеку gir_ffi:
require 'gir_ffi' GirFFI.setup(:ValaObject) # Создание объекта ValaObject.say_hello_to('Ruby') class MyValaClass < ValaObject::ValaClass def append_to_name(suffix) super + ' (subclassed) ' + suffix end end instance = MyValaClass.new puts instance.append_to_name("called from Ruby")
Существующие привязки
Список существующих привязок для GObject Introspection выглядит следующим образом:
- Vala – Родная поддержка GIR.
- Genie – Родная подержка GIR.
- PyGObject – привязки для Python
- Gjs – Javascript (spidermonkey)
- Seed – Javascript (JSCore, WebKit JS engine)
- node-gir – Node.js (V8 Engine)
- ruby-gir-ffi – Ruby
- gobject-for-php – PHP
- lgob – Lua (этап компиляции)
- lgi – Lua (этап исполнения)
- GTK2-Perl/Introspection – привязки для Perl
- guile-gir – Scheme (guile)
- sbank – Scheme (Ikarus, Ypsilon)
- JGIR – Java/JVM (этап компиляции, через typelib)
- GObjectIntrospection/GObjectConsume – C++, Qt (этап компиляции)
- factor-gir – Factor
- gogobject – Go (этап компиляции)
- cl-gobject-introspection – Common Lisp
- cl-gir – GIR for Common Lisp (в процессе)
- haskel-gi – Haskell (в процессе)
- mono-introspect – Mono
- ocaml-gir – Ocaml (этап компиляции)
- gir2pascal – Pascal
Ссылки
2 GObject for your favorite language
Текст тезисов доступен под лицензией Creative Commons Attribution-ShareAlike 3.0.