引言
随着 Rust 生态的发展,一些 Rust 语言实现的优秀工具或基础协议库,受到越来越多的企业或开发者青睐。与此同时,使用 Rust 语言对已有产品和工具进行性能优化或安全性提升,以及开发其它语言的扩展,这样的案例也越来越多。像被大家广泛使用的 curl 工具,其开发者 Daniel Stenberg 已采用 Rust 实现的 HTTP 协议库 hyper 来提供内存安全的 curl。
为了不同语言生态中的开发者可以快速地使用 Rust 语言以及 Rust 生态中优秀的工具或库,Rust FFI 编程计划通过编写一系列文章,专门介绍 C 语言之外的其它语言如何调用 Rust 导出库。目前准备介绍的语言列表有 Python,Ruby,Node.js,Go,Java,PHP。
对于每种语言,如果将 Rust 库的公共接口转换为应用程序二进制接口( C ABI),则在其它编程语言中可以相对容易地使用它们,当前列表中的语言都具有某种形式的外部函数接口(C FFI),剩下的就是其它语言和 Rust 类型之间的相互转换。
因此,同之前介绍过的 C 调用 Rust 导出库类似,文章基本上均会先介绍该语言中支持的 FFI 库,然后通过设计一些示例,分别介绍在该语言中调用 Rust 导出库时,如何处理 Rust 中的常见数据类型,包括数值,字符串,数组,结构体等。
Python 中的 FFI 库
目前 Python 中常用来与 FFI 交互的有 ctypes 和 cffi。其中,ctypes
已被包含在 Python 标准库中,成为 Python 内建的用于调用动态链接库函数的功能模块。ctypes
的主要问题是,我们必须使用其特定的 API 完全重复 C ABI 的声明。cffi
则是则通过解析实际的 C ABI 声明,自动推断所需的数据类型和函数签名,以避免重写声明。ctypes
和cffi
都使用了libffi
,通过它实现 Python 动态调用其他语言的库。在本文中的示例,我们采用 cffi
库。
安装
最快捷的安装方式是通过 pip
:
pip install cffi
或者通过项目链接 https://pypi.python.org/pypi/cffi,下载源码,编译安装,这里不做介绍,参考链接中有相关的介绍文档。