language-agnostic - 语言绑定(bind)如何工作?

标签 language-agnostic binding

语言绑定(bind)如何工作?

例如,如何将用一种语言编写的库绑定(bind)到另一种语言?绑定(bind)是否会使用与库相同的语言或绑定(bind)所使用的语言编写?

是否可以在所有语言之间进行绑定(bind),或者该语言是否必须以某种方式支持绑定(bind)?如果是这种情况,那么该支持如何发挥作用?

最佳答案

大多数语言要么是用 C(Perl、Python、Ruby、Tcl ...)编写的,要么与 C(C++、C#、Objective-C)兼容。因此,对于大多数语言来说,通过编写一些包装函数将该语言的数据结构转换为 native C 数据结构,可以轻松使用 C 库。甚至有一个自动(或半自动,取决于所需的复杂性)工具:SWIG .

这是大多数库用 C 编写的主要原因之一。它使得将低级代码移植到多种目标语言变得容易。使用此策略的库示例包括 SQLite、Tk 和 wxWidgets。

另一种策略是使用操作系统功能将库导出到语言中立的共享库中。在 Windows 上,这将是 DLL,在 Unixen 上,它们将是共享库。大多数 Microsoft 产品都使用这种策略,因此无论原始代码用什么编写,只要将其编译为 DLL,您都可以轻松访问该库。使用此策略的非 Microsoft 库的示例包括 libpurple 和 gtk。

第三种选择是使用IPC。最常见的方法是使用套接字,因为它为大多数人所熟悉并且非常跨平台。严格来说,使用此方法的代码不是库。它们是服务器,它们的“API”在技术上是服务。但对于使用这些服务的普通程序员来说,它们看起来就像常规 API,因为大多数语言绑定(bind)都抽象了网络代码并提供简单的函数/方法调用。使用此策略的“库”示例包括 Xwindows、Gimp 脚本和大多数数据库,例如 MySQL 和 Oracle。

还有其他更复杂的方法来提供对用另一种语言编写的库的访问,包括实际嵌入该语言的解释器,但以上 3 种是最常见的。

<小时/>

澄清

我觉得我应该澄清一下第一种方法和第二种方法的区别。

在第一种方法中,库仍然像第二种方法一样编译成 dll 或 .so,但主要区别在于 dll 必须符合更高级别的标准/协议(protocol)。例如,Tcl 无法加载任何任意 dll,因为它期望进出函数的所有值都是指向 struct Tcl_Obj 的指针。 。因此,为了使用编译为普通旧 dll 的库,您需要编译另一个 dll,该 dll 通过包装函数访问第一个 dll,将所有变量和函数参数转换为 struct Tcl_Obj* .

但是某些语言(例如 VB)可以加载普通的旧 C dll。这就是第二种方法的一个例子。

关于language-agnostic - 语言绑定(bind)如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4546941/

相关文章:

java - 需要从绑定(bind)文件在 package-info.java 中生成 JAXB 注释

c# - 将 TextBox 的文本绑定(bind)到 list<T> 值的总和

c# - 从新窗口绑定(bind) WPF

算法:在圆圈中找到峰值

一次解决查找最大值的算法

data-structures - 链表的应用

language-agnostic - Web 应用程序中常用的键盘快捷键

language-agnostic - 使所有网站的文件夹不可访问

c# - 将 IsEnabled 属性绑定(bind)到 WPF 中的 bool 值

python - Tkinter 中的关键命令