Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
branch: master

Fetching latest commit…

Octocat-spinner-32-eaf2f5

Cannot retrieve the latest commit at this time

Octocat-spinner-32 pictures
Octocat-spinner-32 scripts
Octocat-spinner-32 themes
Octocat-spinner-32 README.textile
Octocat-spinner-32 gobject-introspection-slides.html
Octocat-spinner-32 sync
README.textile

История и цели проекта

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

Something went wrong with that request. Please try again.