По большей части большинство языков написаны на 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-библиотеки. Так что это будет пример второго подхода.