Как работают языковые привязки? - PullRequest
38 голосов
/ 28 декабря 2010

Как работают языковые привязки?

Например, как сделать привязки из библиотеки, написанной на одном языке, к другому языку?Будут ли привязки написаны на том же языке, что и библиотека или язык, для которого эти привязки?

Можно ли создавать привязки для всех языков и для всех языков или язык должен каким-то образом поддерживать привязки?Если это так, то как работает эта поддержка?

Ответы [ 2 ]

31 голосов
/ 28 декабря 2010

По большей части большинство языков написаны на C (Perl, Python, Ruby, Tcl ...) или совместимы с C (C ++, C #, Objective-C). Поэтому для большинства языков легко использовать библиотеку C, написав некоторые функции-оболочки для преобразования структур данных на этом языке в собственные структуры данных C. Для этого есть даже автоматический (или полуавтоматический, в зависимости от требуемой сложности) инструмент: SWIG .

Это одна из основных причин, по которой большинство библиотек написано на C. Это просто упрощает перенос низкоуровневого кода на несколько целевых языков. Примеры библиотек, использующих эту стратегию, включают SQLite, Tk и wxWidgets.

Другая стратегия заключается в использовании функций ОС для экспорта библиотеки в не зависящую от языка общую библиотеку. В Windows это будут библиотеки DLL, а в Unixen - общие библиотеки. Большинство продуктов Microsoft используют эту стратегию, поэтому не имеет значения, что написано в оригинальном коде, вы можете легко получить доступ к библиотеке, если она скомпилирована как DLL. Примеры библиотек сторонних разработчиков, использующих эту стратегию, включают libpurple и gtk.

Третий вариант - использовать IPC. Самый распространенный метод - использовать сокеты, потому что он знаком большинству людей и очень кроссплатформенен. Код, использующий этот метод, строго говоря, не является библиотеками. Они являются серверами, а их «API» технически сервисами. Но для обычного программиста, использующего сервисы, они выглядят как обычные API, потому что большинство языковых привязок абстрагируют сетевой код и представляют простые вызовы функций / методов. Примеры «библиотек», использующих эту стратегию, включают Xwindows, Gimp-скриптинг и большинство баз данных, таких как MySQL и Oracle.

Существуют и другие, более запутанные способы предоставления доступа к библиотекам, написанным на другом языке, включая фактическое встраивание интерпретатора этого языка, но вышеприведенные 3 являются наиболее распространенными.


Разъяснение

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

В первом подходе библиотека все еще компилируется в dll или. Как и во втором подходе, но основное отличие состоит в том, что dll должна соответствовать стандарту / протоколу более высокого уровня. Tcl, например, не может загрузить произвольную dll, потому что он ожидает, что все значения, входящие и выходящие из функции, будут указателем на struct Tcl_Obj. Таким образом, чтобы использовать библиотеку, скомпилированную как простой старый dll, вам нужно скомпилировать другой dll, который обращается к первому dll через функции-оболочки, которые преобразуют все переменные и параметры функции в struct Tcl_Obj*.

Но некоторые языки, такие как VB, могут загружать простые старые C-библиотеки. Так что это будет пример второго подхода.

1 голос
/ 28 декабря 2010

Теоретически может быть создана связующая структура, которая могла бы использовать независимый от языка подход, но чаще, чем не обязательные функции, встроена в данный язык (структуру).

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

База привязок сводится к уведомлению; уведомление о том, что что-то изменилось. Как правило, это может быть выполнено с помощью шаблона публикации / подписки, который по определению не зависит от языка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...