Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

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

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

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