长期以来,我不太了解混合不同的编程语言。根据this Wikipedia article,可以通过以下几种方式来完成外部函数接口(interface)(或FFI):



我的问题:

  • 和之间有什么区别
    第一种,第二种和第三种方式?看来
    我,他们都是为了汇编代码
    所谓的语言变成一些
    具有目标文件和 header 的库
    文件,然后由
    通话语言。
  • One source it links说,
    实现FFI可以在
    几种方法:



    我想知道第一种方式
    链接的来源与
    维基百科的第一种方式?

    第三种方式是什么
    来源是什么意思?它对应于Wikipedia中的第四种方式吗?
  • the same source中,比较列出的三种方式时,似乎在说
    填补两者之间空白的工作
    两种语言正在逐渐
    从被叫语言转变
    调用语言。我曾是
    想知道如何理解?对于Wikipedia中的四种方式,这种转变是否也正确?
  • Language binding和FFI
    等价的概念?他们怎么样
    相关和不同?

  • 我想知道下面的每个示例在Wikipedia或引文中的引用方式是哪一种?
  • Common Object Request Broker Architecture (CORBA)
  • 在C++中调用C,由C++中的extern“C”声明为
    禁用名称处理。
  • 通过MATLAB Interface to Shared Libraries在Matlab中调用C,即首先通过通用C将C代码编译到共享库中
    编译器(例如gcc),然后
    加载,从
    并卸载共享库
    通过Matlab函数
    loadlibrary(),calllib()和
    unloadlibrary()。
  • 在MATLAB中调用C,作者:Creating C/C++ Language MEX-Files
  • 通过mcc compiler调用C语言中的Matlab
  • 也可以通过JNI调用Java中的C++,也可以通过JNI调用C++中的Java。
  • 使用SWIG调用其他语言的C / C++
  • 通过Ctypes module在Python中调用C。
  • Cython
  • 在python中调用R,由RPy
  • Programming Language Bindings to OpenGL from various languages,例如Python,Fortran和Java
  • 来自各种语言的C库(例如Cairo)的绑定(bind),
    例如C++,Python,Java,Common Lisp

  • 感谢您的启迪!最好的祝福!

    最佳答案

    可能有一个具体的例子会有所帮助。让我们以宿主语言为Python, guest 语言为C。这意味着Python将调用C函数。

  • 第一种选择是以特定方式编写C库。对于Python,标准方法是在其他条件下,使用Py_Object *的第一个参数编写C函数。例如(from here):
    static PyObject *
    spam_system(PyObject *self, PyObject *args)
    {
        const char *command;
        int sts;
    
        if (!PyArg_ParseTuple(args, "s", &command))
            return NULL;
        sts = system(command);
        return Py_BuildValue("i", sts);
    }
    

    是可从Python调用的C函数。为此,必须在编写库时考虑Python兼容性。
  • 如果要使用现有的C库,则需要另一个选项。一种是具有一种工具,该工具以适合于宿主语言使用的格式来生成此现有库的包装。以Swig可以用来绑定(bind)多种语言。给定现有的C库,您可以使用swig有效地生成C代码,该代码在遵循Python约定的同时调用现有的库。有关构建Python模块的信息,请参见the example
  • 我们已经存在的C库的另一个选择是从Python库调用它,该库在运行时有效地包装了调用,例如ctypes。虽然在选项2中有必要进行编译,但这不是现在。

  • 另一件事是,有很多选项(确实有重叠)可以用一种语言从另一种语言调用函数。有FFI(据我所知等效于语言绑定(bind))通常指的是同一进程(可以说是同一可执行文件的一部分)中多种语言之间的调用,并且存在进程间通信方式(本地和网络) 。诸如CORBA和Web服务(SOAP或REST)以及COM +和远程过程调用之类的东西通常属于第二类,不被视为FFI。实际上,他们大多没有规定在交流的任何一方都可以使用的任何特定语言。我会松散地将它们作为IPC(进程间通信)选项,尽管在基于网络的APi(如CORBA和SOAP)的情况下这是简化的。

    进入您的 list ,我会提出以下意见:
  • 通用对象请求代理体系结构: IPC,不是FFI
  • 通过C++中的extern "C"声明在C++中调用C以禁用名称重整。 ****
  • 通过MATLAB与共享库的接口(interface)在Matlab中调用C 选项3(类似ctypes)
  • 通过创建C / C++语言MEX文件在Matlab中调用C 选项2(类似Swig)
  • 由mcc编译器选项2(类似于Swig)在C中调用Matlab
  • 通过JNI调用Java中的C++,并通过JNI调用C++中的Java。选项3(类似于ctypes)
  • 使用SWIG调用其他语言的C / C++ 选项2(swig)
  • 通过Ctypes在python中调用C 选项3(ctypes)
  • Cython 选项2(类似辫子)
  • 在python中通过RPy调用R,选项3(类似于ctypes),部分关于数据交换(不是FFI)

  • 后两个根本不是外来函数接口(interface),因为使用了该术语。 FFi与编程语言之间的交互有关,应该能够使一种语言的任何库(具有适当的限制)可供另一种语言使用。可以使用一种语言访问的特定库不是FFI制造的。
  • 从各种语言到OpenGL的编程语言绑定(bind)OpenGL
  • 来自各种语言的C库的绑定(bind)
  • 10-01 06:10
    查看更多