pal*_*ind 42 language-agnostic binding
语言绑定如何工作?
例如,如何将用一种语言编写的库中的绑定转换为另一种语言?绑定是否用与库或绑定语言相同的语言编写?
是否可以与所有语言进行绑定或者语言是否必须以某种方式支持绑定?如果是这种情况,那么这种支持如何运作?
sle*_*man 34
在大多数情况下,大多数语言都是用C语言编写的(Perl,Python,Ruby,Tcl ...)或者与C(C++,C#,Objective-C)兼容.因此,对于大多数语言,通过编写一些包装函数将该语言中的数据结构转换为本机C数据结构,可以很容易地使用C库.甚至还有一个自动(或半自动,取决于所需的复杂性)工具:SWIG.
这是大多数库用C语言编写的主要原因之一.它使得将低级代码移植到多种目标语言变得容易.使用此策略的库示例包括SQLite,Tk和wxWidgets.
另一种策略是使用OS功能将库导出到与语言无关的共享库中.在Windows上,这将是DLL,在Unixen上,它们是共享库.大多数Microsoft产品都使用此策略,因此只要将其编译为DLL,您可以轻松访问库,无论您编写的原始代码是什么.使用此策略的非Microsoft库的示例包括libpurple和gtk.
第三种选择是使用IPC.最常见的方法是使用套接字,因为它对大多数人来说都很熟悉并且非常跨平台.严格来说,使用此方法的代码不是库.它们是服务器,它们的"API"是技术上的服务.但对于使用服务的普通程序员来说,它们看起来像常规API,因为大多数语言绑定都会抽象出网络代码并呈现简单的函数/方法调用.使用此策略的"库"示例包括Xwindows,Gimp脚本和大多数数据库,如MySQL和Oracle.
还有其他更复杂的方式来提供对用其他语言编写的库的访问,包括实际嵌入该语言的解释器,但上述3是最常见的.
我觉得我应该澄清第一种和第二种方法的区别.
在第一种方法中,库仍然被编译成dll或.so,就像第二种方法一样,但主要区别在于dll必须符合更高级别的标准/协议.例如,Tcl无法加载任何任意dll,因为它期望进出函数的所有值都是指向a的指针struct Tcl_Obj.因此,为了使用编译为普通旧dll的库,您需要编译另一个dll,它通过将所有变量和函数参数转换为的包装函数来访问第一个dll struct Tcl_Obj*.
但是像VB这样的语言可以加载普通的旧C dll.这就是第二种方法的一个例子.