Международная конференция разработчиков
и пользователей свободного программного обеспечения

Обзор архитектуры и возможностей 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 выглядит следующим образом:

Ссылки

1 GTK+ Language Bindings

2 GObject for your favorite language

Лицензия Creative Commons
Текст тезисов доступен под лицензией Creative Commons Attribution-ShareAlike 3.0.