Rust 的 C FFI 让我们得以利用几十年积累的 C 语言软件遗产,但这场交易是反过来的。我们在编译期用 Rust 证明内存安全,然后跨过一道 unsafe 边界,信任某个 C 库遵守一份两种语言都无法强制执行的契约。遗留代码依然是廉价路径,而重写它才是昂贵的那条路。
Fil-C 提供了一笔更有意思的交易。它用 capabilities(能力)、运行时检查和一个并发垃圾收集器重新编译 C 和 C++。内存安全违规会 panic,而不是沦为漏洞利用。现有软件往往几乎不需要改动源码,但要在运行时为安全买单。
我希望有一个讲 Fil-C ABI 的 Rust FFI。第一个版本可以刻意做得极窄:标量值、复制的字符串和切片,以及不透明句柄。它会生成安全的 Rust 包装器,用 Fil-C 编译完整的 C 依赖图,并且不提供返回普通不安全 C 的逃生舱。共享内存可以留到以后,等桥接层能让 Fil-C 获得一个 Rust 可以可靠撤销的 capability 再说。
这不是 bindgen 的新选项。Fil-C 与 C 源码兼容,但刻意不与 ABI 兼容;普通 Rust 的 extern "C" 讲的是 Fil-C 称为 Yolo-C 的那套 ABI。搭建这座桥,意味着要教会 Rust、Fil-C,或者一对生成的桩代码,如何在不让 Fil-C 的保证流失的前提下交换值。如果这事容易,它早就存在了。
这个技术栈里已经有一个重要部分在成形。filnix 将 Fil-C 打包成 Nix 交叉编译平台,并为 100 多个 nixpkgs 软件包提供了移植。把 Fil-C 当作一个平台,意味着 Nix 会为 Fil-C ABI 重建传递依赖闭包,而不是意外地把普通 C 链接进去。filnix 还不是 Rust 桥,但它提供了可复现的工具链、软件包宇宙,以及可以搭建这座桥的试验场。
Zig 正从另一个方向逼近同一个问题。Andrew Kelley 提出了一个受 Fil-C 启发的可选 fil ABI。它会是这条路上又一个值得关注的方向。
热门跟贴