LINUX.ORG.RU

Как пишутся биндинги?


0

1

Добрый вечер.

Возникла необходимость получить в своё распоряжение возможность работать с Clutter из Swi-Prolog (т.е., вызывать сишный код). До этого написанием биндингов никогда не занимался, поэтому возник ряд вопросов. Но прежде чем задавать их, в двух словах расскажу о том, что из себя представляет Swi'шный FFI, чтобы было понятнее, что мне нужно.

Swi-Prolog позволяет напрямую обращаться к функциям из специально заготовленных *.so, например:

#include <SWI-Prolog.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <ctype.h>

foreign_t pl_lowercase(term_t u, term_t l)
{
	printf("%d\n", count);
	count++;
	
	char *copy;
	char *s, *q;
	int rval;
	
	if (!PL_get_atom_chars(u, &s))
		return PL_warning("lowercase/2: instantiation fault");

	copy = malloc(strlen(s) + 1);
	for (q = copy; *s; q++, s++)
		*q = (isupper(*s) ? tolower(*s) : *s); 
		
	*q = '\0';
	rval = PL_unify_atom_chars(l, copy);
	free(copy);
	return rval;
}

install_t install()
{
	PL_register_foreign("lowercase", 2, pl_lowercase, 0);
} 

Как видно, Swi-Prolog работает только с функциями, которые возвращают и принимают специальные типы.

Выражаясь по русски, для каждой «обычной функции» мне нужно написать небольшую обёртку, которая будет преобразовывать прологовские типы в сишные и обратно. Ничего сложного, но много ручной работы.

А теперь вопросы:

  • Правильно ли я понимаю, что сегодня никто руками биндинги не пишет, и всё (или почти всё) генерируется автоматически?
  • Если да, то как это делается? На данный момент у меня идея такова - составить нечто вроде БД всех Clutter'овских функций, структур, итп., и уже по ней генерировать нужный мне *.so.
  • Если остальные используют схожий подход, значит ли это, что такие БД уже должны быть собраны до меня, и мне останется лишь их вежливо попросить у разработчиков Clutter или биндингов к нему?
  • «Обернуть» функции довольно тривиально (если не считать всяких variable argument lists, итп). Как быть с макросами?
  • Есть ли готовые работы, от которых можно было бы оттолкнуться?
  • Есть ли что либо почитать по этой теме?

Любые другие мудрые советы приветствуются.

★★★★

> Правильно ли я понимаю, что сегодня никто руками биндинги не пишет, и всё (или почти всё) генерируется автоматически?

Именно.

Если да, то как это делается?

Используй Lisp.

anonymous
()

Правильно ли я понимаю, что сегодня никто руками биндинги не пишет, и всё (или почти всё) генерируется автоматически?

Для больших библиотек, да.

Если да, то как это делается?

По-разному, например разбором заголовочных файлов.

На данный момент у меня идея такова - составить нечто вроде БД всех Clutter'овских функций, структур, итп., и уже по ней генерировать нужный мне *.so.

Цитата с сайта clutter:

Developed in C, with language bindings for Perl, Python, C#, C++, Vala and Ruby. Clutter also generates introspection data during build, for dynamic language binding using the GObject introspection API.

Так что свою базу функций городить не надо.

Есть ли готовые работы, от которых можно было бы оттолкнуться?

В гугл по теме GObject Introspection.

Begemoth ★★★★★
()
Ответ на: комментарий от Begemoth

> Developed in C, with language bindings for Perl, Python, C#, C++, Vala and Ruby. Clutter also generates introspection data during build, for dynamic language binding using the GObject introspection API.

В гугл по теме GObject Introspection.

Спасибо, сам как-то пропустил сей момент мимо глаз.

runtime ★★★★
() автор топика

Правильно ли я понимаю, что сегодня никто руками биндинги не пишет, и всё (или почти всё) генерируется автоматически?

Да.

Если да, то как это делается?

Написать парсилку хидеров, которая бы парсила оригинальные хидеры и создавала из них биндинг для нужного языка.

«Обернуть» функции довольно тривиально (если не считать всяких variable argument lists, итп). Как быть с макросами?

А есть полезные макросы, которые нельзя переделать в функции или константы?

Deleted
()
Ответ на: комментарий от Deleted

А есть полезные макросы, которые нельзя переделать в функции или константы?

errno, например.

quasimoto ★★★★
()

а можно по подробнее про то как пишутся биндинги, например есть либа lib.so с функциями foo() и bar(), как мне вызвать эти функции из питона?

RA
()

Возможно, полезнее всего добавить поддержку пролога в SWIG? судя по всему, это должно быть не сложно и позволит генерировать биндинги для любых библиотек.

// полный оффтоп: а что на аве?

val-amart ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.