Language agnostic 了解外文功能接口(FFI)和语言绑定

Language agnostic 了解外文功能接口(FFI)和语言绑定,language-agnostic,programming-languages,binding,ffi,Language Agnostic,Programming Languages,Binding,Ffi,长期以来,混合使用不同的编程语言一直是我不太理解的事情。根据,外部功能接口(或FFI)可以通过几种方式完成: 要求以特定方式指定或实现可由宿主语言调用的来宾语言函数;通常使用某种兼容库 使用工具自动“包装”带有适当粘合代码的来宾语言函数,执行任何必要的翻译 包装器库的使用 限制可跨语言使用的主机语言功能集。例如,从C调用的C++函数可能不包括(通常)引用参数或抛出异常。 我的问题: 两者之间的区别是什么 第一、第二和第三种方式?似乎 我想他们都是来编译代码的 这种语言被称为某种语言 具有对象文件

长期以来,混合使用不同的编程语言一直是我不太理解的事情。根据,外部功能接口(或FFI)可以通过几种方式完成:

  • 要求以特定方式指定或实现可由宿主语言调用的来宾语言函数;通常使用某种兼容库
  • 使用工具自动“包装”带有适当粘合代码的来宾语言函数,执行任何必要的翻译
  • 包装器库的使用
  • 限制可跨语言使用的主机语言功能集。例如,从C调用的C++函数可能不包括(通常)引用参数或抛出异常。
  • 我的问题:

  • 两者之间的区别是什么 第一、第二和第三种方式?似乎 我想他们都是来编译代码的 这种语言被称为某种语言 具有对象文件和标题的库 文件,然后由 呼叫语言
  • 说,, 外国金融机构的实施可以通过以下方式完成: 有几种方法:

    • 要求目标语言中的被调用函数实现 具体协议
    • 实现采用给定低级语言的包装器库 函数,并用代码“包装”它,以便与 高级语言约定
    • 要求声明为本机的函数使用高级功能的子集(与低级语言兼容)
    我想知道第一条路是不是 链接的源与链接的源相同 维基百科的第一条路

    第三种方式是什么 来源是什么?它是否对应于维基百科中的第四种方式

  • 实际上,当比较它列出的三种方式时,它似乎是这样说的 填补两者之间差距的工作 这两种语言是逐渐发展起来的 从被调用的语言转移 对呼叫语言。我是 想知道怎么理解吗?维基百科中的四种方式也是如此吗
  • 你和外国金融机构是谁 等价概念?他们怎么样 相关与不同

    来自编程语言的绑定 对于库或操作系统服务来说,API 在公共场所提供这种服务 语言

  • 我想知道在维基百科的引文中,或者在来源中,下面的每个例子都属于哪一种

    • C++调用C,由C++中的“C”外部声明 禁用名称损坏
    • 在Matlab中调用C,即首先通过通用C将C代码编译到共享库中 编译器,如gcc,然后 从中加载、调用函数 以及卸载共享库 通过Matlab函数 loadlibrary()、calllib()和 unloadlibrary()
    • 在Matlab中调用C
    • 用C调用Matlab
    • 在爪哇调用C++,在C++中调用和调用java,也用
    • 在其他语言中调用C/C++时,使用
    • 在Python中调用C
    • 在Python中调用R
    • ,例如Python、Fortran和Java
    • C库的绑定,例如来自各种语言的绑定, 如C++、Python、java、通用LISP

  • 谢谢你的启发!致以最良好的祝愿!

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

  • 第一种选择是以特定的方式编写C库。在Python的情况下,标准的方法是使用第一个参数
    Py_Object*
    以及其他条件编写C函数。例如():

    是一个可从Python调用的C函数。为此,编写库时必须考虑Python兼容性

  • 如果要使用现有的C库,则需要另一个选项。一种是使用一个工具,以适合宿主语言使用的格式生成并包装现有库。可以用来连接多种语言的Take。给定现有的C库,您可以使用swig有效地生成调用现有库的C代码,同时遵守Python约定。有关构建Python模块的详细信息,请参见

  • 对我们来说,已经存在的C库的另一个选择是从Python库中调用它,该库在运行时有效地包装了调用,如。虽然在选项2中编译是必要的,但这次不是

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

    试一试你的清单,我大胆提出以下意见:

    • 公共对象请求代理体系结构:IPC,而不是FFI
    • C++调用C,C++中的<代码>外部“C”<代码>声明,禁用名称的修改。李>
    • 在Matlab中调用C,通过Matlab接口访问共享库选项3(类似ctypes)
    • 在Matlab中调用C,通过创建C/C++语言MEX文件选项2(类似swig)
    • 通过mcc编译器调用C中的Matlab选项2(类似swig)
    • 在爪哇调用C++
      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);
      }