# 什么是 ffi ?

ffi (FFI) 是 foreign function interface 的简写,该术语来自Common Lisp规范,该规范明确指代用于跨语言调用的语言功能;这个词也被Haskell和Python编程语言正式使用。其他语言使用其他术语指代这一概念,如Java将其FFI称为JNI(Java本机接口)或JNA(Java本机访问),外部功能接口已成为提供此类服务的机制的通用术语。 外部函数接口的主要功能是将一种编程语言的语义和调用约定与另一种编程语言的语义和约定进行匹配。该过程还必须考虑两者的运行时环境和/或应用程序二进制接口。

只有大约一半的语言有FFI或者类似的实现,因为:

  1. 如果一种语言支持垃圾回收(GC),而另一种不支持;必须注意非GC语言代码不会导致其他GC失败。例如,在JNI中,它从Java接收到的对象引用的C代码必须在Java运行时环境(JRE)中“注册”。否则,Java可能会在C完成对象之前删除它们。
  2. 复杂的对象或数据类型可能很难从一个环境映射到另一个环境。
  3. 由于上述映射问题,两种语言都可能无法维护对可变对象的同一实例的引用。
  4. 一种或两种语言可能正在虚拟机(VM)上运行;此外它们还可能是不同的VM。
  5. 跨语言继承可能特别困难。

chez scheme作为一种Lisp的一种方言具有强大的FFI功能,通过ffi scheme可以与几十种语言交互。

# ffi相关库的综述

ffi 相关的库是 scheme-lib 的精华之一 ,scheme-lib 的 ffi 库种类繁多,功能完备,下面将各自的功能和位置进行介绍,名称用类似(c c-ffi )的形式表示,(c c-ffi )表示ffi功能以c-ffi.ss的形式提供,位置位于scheme-lib的packages目录的c文件夹下。

  • (c c-ffi ) 是从C语言及其库中ffi出的函数,例如:c-a64l c-abort c-abs c-atexit c-atof c-atoi c-atol c-bsearch c-calloc c-div c-drand48 c-ecvt c-erand48 c-exit c-fcvt c-free c-gcvt c-getenv c-getsubopt c-grantpt c-initstate c-l64a c-labs 这些函数基本和原来C语言的对应函数一致,如c-free基本和free一致的。
  • (cffi cffi)(c c-ffi )不同,这是一个将用户写的C语言库链接到scheme的库,详见文档5.1
  • (dffi dffi)是下一代 cffi 库,功能与 cffi 基本相同,性能略好于cffi。
  • (mongoc bson-ffi ) 是对bson进行 ffi 操作的库,BSON是MongoDB数据库扩展JSON形成的一种数据交换格式,BSON之名缘于JSON,含义为Binary JSON(二进制JSON),主要用于MongoDB数据存储和网络传输。
  • (mongoc mongoc-ffi ) 是通过C对MongoDB数据库进行 ffi 操作的库,包含了MongoDB数据库的所有主要功能,MongoDB是著名的非关系型数据库,适合文档的存储查询。
  • (mysql mysql-ffi ) 是对mysql数据库进行 ffi 操作的库,包含了mysql数据库的所有主要功能,mysql就不多做介绍了,世界上最有名的数据库之一。
  • (net ) 中有四个和网络相关的ffi库, (net curl-ffi )是对libcurl进行 ffi 操作的库。libcurl主要功能就是用不同的协议连接和沟通不同的服务器,libcurl当前支持http, https, ftp, gopher, telnet, dict, file, 和ldap 协议,同样支持HTTPS证书授权,HTTP POST, HTTP PUT, FTP 上传(当然你也可以使用PHP的ftp扩展), HTTP基本表单上传,代理,cookies,和用户认证。(net event2-ffi ) 是对libevent进行 ffi 操作的库,这是一个网络高性能服务框架,目前版本已更新至2.X.X,目前libevent支持/dev/poll、kqueue(2)、事件端口、POSIX select(2)、Windows select()、poll(2)和epoll(4)。内部事件机制完全独立于公开的事件API,简单的libevent更新可以提供新的功能,而无需重新设计应用程序。(net socket-ffi ) 是对网络libsocket进行 ffi 操作的库,socket中文名称是套接字,是一种独立于协议的网络编程接口,很受通信软件编写者欢迎。(net uv-ffi) 是对网络libuv进行 ffi 操作的库,libuv是一个关于异步IO的跨平台支持库。
  • (regex ) 和正则表达式相关的ffi库
  • (sqlite sqlite3-ffi) 是对sqlite进行ffi操作的库。sqlite 是一个软件库,实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。同时这是一个在嵌入式设备上也能正常运行的数据库,sqlite3是它较新的一个版本,需要注意的是过去的sqlite相比正常的数据库而言性能比较低,而目前已经比较接近。
  • (tensorflow tensorflow-ffi )是对tensorflow进行ffi操作的库。tensorflow是一个基于数据流编程(dataflow programming)的符号数学系统,被广泛应用于各类机器学习(machine learning)算法的编程实现
  • (termios termios ) 是对 libtermios 进行 ffi 操作的库。
  • (thread thread-ffi ) 是对 libthread 进行 ffi 操作的库。
  • (thread scm-ffi ) 是对 libscm 进行 ffi 操作的库。
Last Updated: 12/11/2020, 1:11:36 PM