语言绑定如何工作?
例如,如何将从一种语言编写的库中的绑定转换为另一种语言?绑定是否用与库或绑定语言相同的语言编写?
是否可以与所有语言进行绑定或语言是否必须以某种方式支持绑定?如果是这种情况,那么这种支持如何运作?
答案 0 :(得分:28)
在大多数情况下,大多数语言都是用C语言编写的(Perl,Python,Ruby,Tcl ...)或者与C(C ++,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或.so,就像第二种方法一样,但主要区别在于dll必须符合更高级别的标准/协议。例如,Tcl无法加载任何任意dll,因为它期望进出函数的所有值都是指向struct Tcl_Obj
的指针。因此,为了使用编译为普通旧dll的库,您需要编译另一个dll,它通过将所有变量和函数参数转换为struct Tcl_Obj*
的包装函数来访问第一个dll。
但是像VB这样的语言可以加载普通的旧C dll。这就是第二种方法的一个例子。
答案 1 :(得分:1)
理论上可以构建一个绑定框架,它可以采用与语言无关的方法,但更常见的是绑定功能不是在给定的语言(框架)中构建的。
当您采用不可知方法时,增加功能集会非常困难。例如,在尝试开发数据库不可知代码时经常会出现这种情况,因此不会利用数据库引擎提供的功能集,因为必须使用最常见的分母。
绑定的基础归结为通知;事情发生了变化的通知。这通常可以通过发布/订阅模式来处理,根据定义,语言是不可知的。