Экспорт C API

C API определяет набор функций и глобальные переменные которые обычно экспортируются из бинарных. C функции имеют произвольное количество аргументов и одно возвращаемое значение. Каждая функция идентифицируется уникальным именем функции и набором C типов которые описывают аргументы функции и возвращаемое значение. Глобальные переменные экспортируемого API также идентифицируются их именем и типом.

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

Для дальнейшего обсуждения, рассмотрим простую C функцию и связанный 32 bit x86 ассемблерный код сгенерированный gcc на моей linux машине:

static void function_foo (int foo) {} int main (int argc, char *argv[]) { function_foo (10); return 0; } push $0xa call 0x80482f4 <function_foo>

Ассемблерный код показанный выше достаточно прямолинейный: первая инструкция помещает шестнадцатеричное значение 0xa (числовое значение 10) как 32 bit целочисленное в стек и вызывает function_foo. Как вы видите, вызов C функции осуществлён gcc непосредственным вызовом функции (вероятно это самая быстрая из возможных реализаций).

Теперь, скажем нам нужно вызвать C функцию function_foo из программы написанной на языке python. Чтобы это сделать, интерпретатору python необходимо:

Процессс описанный выше довольно сложен и есть много способов сделать его полностью автоматическим и прозрачным для C и Python программистов:

Самое большое преимущество реализуемое GType в том, что код совмещения находящийся в границе области исполнения пишется один раз: схема ниже демонстрирует это более ясно.

Схема 1. 


В настоящее время, существует по крайней мере основной код совмещения для Python и Perl, который позволяет использовать C объекты написанные с помощью GType непосредственно в Python или Perl, с минимальными доработками: нет необходимости генерировать огромное количество кода совмещения вручную или автоматически.

Хотя цель была достаточно похвальной, главной задачей является в целом библиотека GType/GObject. C программисты вероятно будут озадачены сложностью особенностей демонстрируемых в следующих главах, если они забудут, что библиотека GType/GObject была разработана не только для объектно-ориентированных улучшений C прграммистам, но и для прозрачной крос-языковой функциональной совместимости.



[1] Есть многочисленные различные реализации систем динамических типов: все C++ компиляторы имеют такую систему, Java и .NET имеют её тоже. Система динамического типа позволяет вам получать информацию о каждом созданном динамическом объекте. Это может быть реализовано с помощью определённой для процесса базы данных: каждый новый объект создаёт регистры характеристик связанного с ним типа в системе. так же это может быть реализовано интерфейсом самоанализа. Общим пунктом между всеми этими разными системами типа и реализациями является то, что они позволяют вам делать запрос метаданных динамического объекта.