[father::元笔记汇总]

梗概

  • FFI(Foreign Function Interface)是这样一种机制:用一种编程语言写的程序能调用另一种编程语言写的函数(routines)。
    • FFI 有两种内涵。
    • 一种是是在当前正在使用的语言(host)中,调用由其它语言(guest)提供的库。
    • 第二种内涵与第一种方向相反,即,使用当前语言(host)写库,供其它语言(guest)调用。不过,后者不是任何语言都能做到的,有些语言即使能做,也会非常吃力。
  • 不同语言称呼这种语言间调用的功能名字可能不同。
    • Common Lisp、Haskell、Python、Rust 这些叫 FFI
    • Java 叫 JNI 或 JNA
    • 还有一些其它语言叫 “绑定”。
      • 严格来说,FFI 与 绑定,意义并不相同,绑定可以理解为 FFI 中的一种实现。
    • JNA-FFI-JNI

适用范围

FFI实现的困难

FFI 实现起来,比想像的要复杂许多,困难体现在:

  • 如果 host 语言(调用主动方)带 GC(垃圾收集器),而 guest 语言(调用被动方)不带,那么可能会在资源管理(创建,释放)上面造成一些问题,需要特别细致地处理;
  • 复杂对象或类型,在映射到两边的时候,可能会有一些不协调甚至失真的现象;
  • 两边要同时引用一个可变对象的时候,可能会遇到问题;
  • 如果两边的语言都是运行在 VM 之上的语言,那么这两个语言之间的直接 FFI 非常困难甚至不可能;
  • 类型系统/对象组合模型/继承机制等其它细节,可能在跨语言的时候,成为障碍;
  • 其它。 所以,虽然都能做 FFI,但是不同语言实现 FFI 的困难程度是不同的。

能较好地提供FFI的语言

可惜,大部分语言只能单向地“索取”。目前所知,能(较方便地)对其它语言提供 FFI 库支持的语言有:

  • C
  • C++(通过定义 C 接口)
  • Rust(通过使用 C 约定)
  • Ada
  • Fortran

JVM 平台语言之间的 FFI

Java 发展到现在,已经形成了一个强大的 JVM 生态。JVM 平台上有大量的新语言产生,比如 Scala, Clojure, JRuby, Jython 等。这些语言前端不同,但是共享同一套 JVM 字节码和调用规范。因此,这些语言和 Java 之间,以及这些衍生语言之间,能比较容易地实现相互调用。

JVM 平台的缺点在于,其生态中的成果,被局限在了 JVM 平台内,无法(或很难)被其它语言平台所享用。

WASM 平台的 FFI

Web Assembly(WASM)是一个新的字节码平台,其势头发展很猛。其有着比 JVM 平台更大的野心和联盟。因为是新设计的字节码,故其在设计的时候,就对 JVM 平台的一些问题做了规避(这方面可 Google 查阅相关资料)。

目前几乎所有主流语言都已实现将 WASM 作为编译目标,并且有相当一部分语言能够加载 WASM 库文件,调用其中的函数。不同的语言编译出的 WASM 效能和体积大小也是不同的。目前来看,C、C++、Rust 这些非 GC 语言能够编译出最精简,执行效率最高的 WASM 字节码。

WASM 的规范还在快速完善中。

原文

Rust FFI 编程 - FFI 概述 - Rust语言中文社区