gpt4 book ai didi

language-agnostic - 了解外部函数接口(interface) (FFI) 和语言绑定(bind)

转载 作者:行者123 更新时间:2023-12-02 23:21:27 30 4
gpt4 key购买 nike

混合不同的编程语言一直是我不太理解的事情。根据this Wikipedia article ,外部函数接口(interface)(或 FFI)可以通过多种方式完成:

  1. Requiring that guest-language functions which are to be host-language callable be specified or implemented in a particular way; often using a compatibility library of some sort.
  2. Use of a tool to automatically "wrap" guest-language functions with appropriate glue code, which performs any necessary translation.
  3. Use of wrapper libraries
  4. Restricting the set of host language capabilities which can be used cross-language. For example, C++ functions called from C may not (in general) include reference parameters or throw exceptions.

我的问题:

  1. 两者之间有什么区别第一种、第二种、第三种方式?看来我他们都是为了编译代码被调用的语言变成一些带有目标文件和头文件的库文件,然后由调用语言。

  2. One source it links说,实现 FFI 可以在几种方法:

    • Requiring the called functions in the target language implement aspecific protocol.
    • Implementing a wrapper library that takes a given low-languagefunction, and "wraps" it with code to do data conversion to/from thehigh-level language conventions.
    • Requiring functions declared native to use a subset of high-level functionality (which is compatible with the low-level language).

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

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

  3. the same source ,当比较它列出的三种方式时,似乎在说填补之间空白的工作两种语言逐渐从被叫语言转移到调用语言。我曾是想知道如何理解?这种转变对于维基百科中的四种方式也是如此吗?

  4. Language binding和外国金融机构等价概念?他们怎么样相关和不同?

    a binding from a programming languageto a library or OS service is an APIproviding that service in thelanguage.

  5. 我想知道以下每个示例属于维基百科引用或来源中的哪种方式?

最佳答案

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

  1. 第一个选项是以特定方式编写 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 约定。请参阅the example用于构建 Python 模块。

  • 使用现有 C 库的另一个选项是从 Python 库调用它,该库在运行时有效地包装调用,例如 ctypes 。虽然在选项 2 中编译是必要的,但这次不是。

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

    看了你的 list ,我冒昧提出以下意见:

    • 通用对象请求代理架构:IPC,而不是 FFI
    • 在 C++ 中调用 C,通过 C++ 中的 extern "C" 声明来禁用名称修改。 ****
    • 通过 MATLAB 共享库接口(interface)在 Matlab 中调用 C选项 3(类似 ctypes)
    • 通过创建 C/C++ 语言 MEX 文件在 Matlab 中调用 C选项 2(类似 swig)
    • 通过 mcc 编译器用 C 语言调用 Matlab 选项 2(类似 swig)
    • 通过 JNI 在 Java 中调用 C++,以及通过 JNI 在 C++ 中调用 Java 选项 3(类似 ctypes)
    • 使用 SWIG 以其他语言调用 C/C++ 选项 2 (swig)
    • 通过 Ctypes 在 Python 中调用 C选项 3 (ctypes)
    • Cython 选项 2(类似喝水)
    • 在 Python 中调用 R,由 RPy 部分是选项 3(类似 ctypes),部分是关于数据交换(不是 FFI)

    接下来的两个根本不是外部函数接口(interface),正如该术语所使用的那样。 FFI 是关于两种编程语言之间的交互,并且应该能够使一种语言的任何库(具有适当的限制)可供另一种语言使用。可通过一种语言访问的特定库不是 FFI 制造的。

    • 各种语言到 OpenGL 的编程语言绑定(bind)
    • 来自不同语言的 C 库的绑定(bind)

    关于language-agnostic - 了解外部函数接口(interface) (FFI) 和语言绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5440968/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com