混合不同的编程语言一直以来我都不太明白。据this Wikipedia article,外国功能接口(或FFI)可以通过多种方式来完成:了解外部函数接口(FFI)和语言绑定
- 要求客人语言功能,这些功能是宿主语言调用指定或以一种特殊的方式来实现;经常使用某种兼容性库。
- 使用工具自动“包装”客人语言功能与适当的胶水代码,执行任何必要的翻译。
- 包装库的使用
- 限制可以跨语言使用的一组主机语言功能。例如,从C调用的C++函数可能(通常)不包括引用参数或抛出异常。
我的问题:
- 什么 第1,第2和第3的方式之间的区别是什么?看来 我都是把 的代码编译成 这个库的目标文件和头文件 ,然后调用语言为 。
One source it links说, 实现一个FFI可以 几种方式来完成:
- 需要在目标语言调用的函数实现 特定的协议。
- 实现一个包含给定的低语言函数的包装库,并用代码“包装”它以执行与高级语言约定的数据转换或从 高级语言约定中进行数据转换。
- 需要本地声明使用高级功能子集(与低级语言兼容)的函数。
我在想,如果在 联动源的第一种方式是相同维基百科 第一种方式?
这个 源代表的第三种方式是什么意思?它对应于维基百科中的第四种方式吗?
- 在 the same source,比较三种方式它列出的时候,似乎想说 填充 两种语言之间的差距的工作是逐步 从所谓的语言 给调用语言转向。我是 想知道如何理解?这种转变在维基百科的四种方式中也是如此吗?
是Language binding和FFI 等效概念?他们如何 相关和不同?
从一种编程语言 库或OS服务绑定在 语言提供服务的API 。
我想知道在维基百科或源代码的引用中哪个方法属于哪个属性?
- Common Object Request Broker Architecture (CORBA)
- 在调用C++ C,通过在C中的extern “C” 声明++到 禁用名字改编。
- 在Matlab调用C,由MATLAB Interface to Shared Libraries,即,首先通过通用C编译C代码共享库 编译器如gcc,然后 加载,调用从 的函数,并且通过MATLAB函数 的LoadLibrary卸载所述共享库 (),calllib()和 unloadlibrary()。
- 调用在Matlab C,由Creating C/C++ Language MEX-Files
- 用C调用Matlab,通过mcc compiler
- 调用用Java C++,通过JNI,和中调用Java在C++中,也通过JNI
- 在其他语言调用C/C++ ,使用SWIG
- 在Python中调用C,由Ctypes module。
- Cython
- 调用在Python R,由RPy
- Programming Language Bindings to OpenGL from various languages,例如Python,Fortran和爪哇
- 绑定为一个C库,如Cairo,从各种语言, 如C++,Python的这样, Java中,Common Lisp的
感谢您的启示!最好的问候!
+1很好的答案。一个注释:“通过创建MEX文件在MATLAB中调用C”更像是“选项1”,它相当于使用C API编写Python扩展。您使用接收'mxArray *'参数的特殊网关例程创建常规共享库。至于“使用mcc编译器在C中调用MATLAB”,它并不是真正的FFI,因为这只是调用其他C代码(MCC编译器生成常规共享库)的C代码。 – Amro 2013-06-25 09:21:40
未提及的另一个选择是“使用MATLAB引擎在C中调用MATLAB”,它类似于[“Python嵌入”](http://docs.python.org/2/extending/embedding.html)继续类比(和使用JNI接口在C中调用Java一样) – Amro 2013-06-25 09:23:47