混合不同的编程语言长期以来一直是我不太理解的事情。根据这篇维基百科文章,可以通过以下几种方式实现外部函数接口(FFI):
我的问题:
- 要求以特定方式指定或实现可在主机语言中调用的客户端语言函数;通常使用某种兼容性库。
- 使用工具自动“包装”客户端语言函数,并使用适当的粘合代码执行任何必要的翻译。
- 使用包装器库
- 限制跨语言使用的主机语言功能集。例如,从C调用的C++函数通常不能包括引用参数或抛出异常。
第一种、第二种和第三种方式有什么区别?在我看来,它们都是将所调用语言的代码编译成某些库,其中包括目标文件和头文件,然后由调用语言进行调用。
其中一篇引用的来源说,实现FFI可以通过几种方式来完成:
- 要求目标语言中被调用的函数实现特定的协议。
- 实现一个包装库,该库采用给定的低级语言函数,并使用代码对其进行“包装”,以执行数据转换到/从高级语言约定。
- 要求声明为本地的函数使用高级功能的子集(与低级语言兼容)。
我想知道链接源中的第一种方式是否与维基百科中的第一种方式相同?
这个来源中的第三种方法是什么意思?它是否对应于维基百科中的第四种方法?
在同一来源中,当比较列出的三种方式时,似乎表明填补两种语言之间差距的工作逐渐从所调用的语言转移到了所调用的语言。我想知道如何理解这一点?这种转移对维基百科中的四种方式也适用吗?
语言绑定和FFI是否是等效的概念?它们如何相关和有何不同?
从编程语言到库或操作系统服务的绑定是提供该语言中该服务的API。
我想知道引文中的每个示例属于维基百科或来源中的哪种方式?
- Common Object Request Broker Architecture (CORBA)
- 通过C++中的extern "C"声明,在C++中调用C,以禁用名称重整。
- 通过MATLAB Interface to Shared Libraries在Matlab中调用C,即首先通过通用C编译器(如gcc)将C代码编译为共享库,然后通过Matlab函数loadlibrary(),calllib()和unloadlibrary()加载、调用和卸载共享库中的函数。
- 通过Creating C/C++ Language MEX-Files在Matlab中调用C。
- 通过mcc compiler在C中调用Matlab。
- 通过JNI在Java中调用C ++,并通过JNI在C ++中调用Java。
- 通过SWIG在其他语言中调用C / C ++。
- 通过Ctypes module在Python中调用C。
- Cython
- 通过RPy在Python中调用R。
- Programming Language Bindings to OpenGL from various languages,例如Python、Fortran和Java
- 来自各种语言的C库的绑定,例如Cairo,例如C ++、Python、Java、Common Lisp。
mxArray *
参数。至于“使用mcc编译器在C中调用MATLAB”,这实际上不是FFI,因为这只是C代码调用其他C代码(MCC编译器生成常规共享库)。 - Amro