混合不同的编程语言一直是我不太了解的事情。根据这篇 Wikipedia article,可以通过以下几种方式完成外部函数接口(或 FFI):
- 要求以特定方式指定或实现可被宿主语言调用的来宾语言函数;经常使用某种兼容性库。
- 使用工具来自动“包装”客户语言函数和适当的胶水代码,执行任何必要的翻译。
- 使用包装库
- 限制可以跨语言使用的宿主语言能力集。例如,从 C 调用的 C++ 函数可能(通常)不包含引用参数或抛出异常。
我的问题:
第一种、第二种和第三种方式有什么区别?在我看来,他们都是将被调用语言的代码编译成带有目标文件和头文件的库,然后由调用语言调用。
它链接的一个消息来源说,可以通过多种方式实现 FFI:
- 要求目标语言中调用的函数实现特定的协议。
- 实现一个包装库,该库采用给定的低级语言函数,并用代码“包装”它以进行与高级语言约定的数据转换。
- 要求声明为原生的函数使用高级功能的子集(与低级语言兼容)。
我想知道链接源中的第一种方式是否与维基百科中的第一种方式相同?
这个来源中的第三种方式是什么意思?它是否对应于维基百科中的第 4 种方式?
在同一来源中,当比较它列出的三种方式时,似乎可以说填补两种语言之间差距的工作正在逐渐从被调用语言转移到调用语言。我想知道如何理解?对于维基百科的四种方式,这种转变是否也是如此?
语言绑定和 FFI 是等价的概念吗?它们有何关联和不同?
从编程语言到库或 OS 服务的绑定是用该语言提供该服务的 API。
我想知道维基百科的引文或以下每个示例的来源属于哪种方式?
- 通用对象请求代理架构 (CORBA)
- 在 C++ 中调用 C,通过 C++ 中的 extern "C" 声明来禁用名称修改。
- 在 Matlab 中调用 C,通过MATLAB Interface to Shared Libraries,即先通过 gcc 等通用 C 编译器将 C 代码编译成共享库,然后通过 Matlab 函数 loadlibrary()、calllib 加载、调用和卸载共享库() 和卸载库()。
- 在 Matlab 中调用 C,通过创建 C/C++ 语言 MEX 文件
- 通过mcc 编译器在 C 中调用 Matlab
- Calling C++ in Java, by JNI和 Calling Java in C++, 同样由JNI
- 使用SWIG以其他语言调用 C/C++
- 通过Ctypes 模块在 Python 中调用 C。
- 赛通
- 在 Python 中调用 R,由RPy
- 从各种语言(如 Python、Fortran 和 Java)到 OpenGL 的编程语言绑定
- 来自各种语言(例如 C++、Python、Java、Common Lisp)的 C 库(例如 Cairo )的绑定