Language agnostic 语言绑定是如何工作的?

Language agnostic 语言绑定是如何工作的?,language-agnostic,binding,Language Agnostic,Binding,语言绑定是如何工作的 例如,如何将用一种语言编写的库绑定到另一种语言?绑定是使用与库相同的语言编写的,还是使用绑定所用的语言编写的 是否可以对所有语言进行绑定或从所有语言进行绑定,或者该语言是否必须以某种方式支持绑定?如果是这样的话,那么这种支持是如何工作的呢?理论上,可以构建一个绑定框架,该框架可以采用语言不可知的方法,但更常见的情况是,绑定功能不是在给定的语言(框架)中构建的 当你采取不可知论的方法时,增加一个特性集是出了名的困难。例如,在尝试开发与数据库无关的代码时,经常会出现这种情况,因

语言绑定是如何工作的

例如,如何将用一种语言编写的库绑定到另一种语言?绑定是使用与库相同的语言编写的,还是使用绑定所用的语言编写的


是否可以对所有语言进行绑定或从所有语言进行绑定,或者该语言是否必须以某种方式支持绑定?如果是这样的话,那么这种支持是如何工作的呢?

理论上,可以构建一个绑定框架,该框架可以采用语言不可知的方法,但更常见的情况是,绑定功能不是在给定的语言(框架)中构建的

当你采取不可知论的方法时,增加一个特性集是出了名的困难。例如,在尝试开发与数据库无关的代码时,经常会出现这种情况,因此不能利用数据库引擎提供的特性集作为必须使用的最常用分母


绑定的基础归结为通知;通知某事发生了变化。这通常可以通过发布/订阅模式来处理,发布/订阅模式的定义与语言无关。

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

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

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

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

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


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

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


但是像VB这样的一些语言可以加载普通的老式C DLL。因此,这将是第二种方法的一个示例。

“语言绑定如何工作”而不是“语言绑定如何工作”。第三人称复数…当你说大多数语言都是用C写的时候,你的意思是他们的ontepreter是用C写的。你提到的包装函数,它们是对Intepreter的扩展还是它们是如何工作的?它们是C包装函数。由于大多数语言的级别比C高得多,它们通常不直接使用C本机数据类型。例如,大多数语言中的数组实际上在C级实现为链表。像Tcl和Perl这样的语言有机制将外部二进制代码加载到解释器中,就像web浏览器和Adobe Photoshop加载插件一样。它可以是将C函数调用转换为对象方法的薄层。例如,通过在C++中使用 ExcNc>代码>机制,将C库转换成面向对象的代码。我强烈建议下载SWIG并将一个简单的C库编译成多种语言的绑定,看看它创建了什么样的包装函数。对于处理简单数字和/或字符串的简单函数,SWIG非常容易使用。非常感谢!这很有帮助@slebetman我知道这很古老,但是对于使用操作系统功能创建dll的策略来说,你是指在windows中使用COM吗?另外,编译器版本之间的C++二进制不兼容吗?因此,如果我有一个用C编写的带有编译器的库,我甚至不能在C中使用它,更不用说在不同的语言中了。我说得对吗?