返回

文章详情

我想要 extern "fil-C"

Hacker News2026年8月13日 17:32

Rust 的 C FFI 让我们可以访问几十年的有用软件,但这个交易有缺陷。我们使用 Rust 在编译时证明内存安全。然后我们越过一个不安全的边界,信任 C 库遵循一个两种语言都无法强制执行的合同。遗留代码仍然是便宜的选择,而重写代码则是昂贵的选择。Fil-C 提供了一个更有趣的交易。它将 C 和 C++ 重新编译为具有能力、运行时检查和并发垃圾回收器的版本。内存安全违规引发恐慌,而不是变成漏洞。现有软件通常需要几乎没有源代码更改,但它在运行时为安全性付费。我想要一个与 Fil-C ABI 兼容的 Rust FFI。第一个版本可以故意保持狭窄:标量值、复制的字符串和切片,以及不透明的句柄。它将生成安全的 Rust 包装器,用 Fil-C 编译完整的 C 依赖图,并且不提供返回普通不安全 C 的逃生口。共享内存可以在以后进行处理,一旦桥接能够向 Rust 可靠地撤销一个能力。这不是 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。这将是 Zig 编译器和标准库中的独立实现,用于编译 Zig 程序及其整个 C 和 C++ 依赖树,并确保运行时内存安全。这与 Rust 桥接需要进入的世界非常接近。但结果将给予我们恰到好处的激励。我们可以使用 Rust 进行编译时安全,然后因使用 C 而付出性能代价。保留遗留库,并保持其内存安全,但每个指针操作都会被检查,其内存参与垃圾回收。将热点路径重写为 Rust 时,这些检查变为静态的,因此税费消失了。C 成为了安全的兼容路径,而不是永久的快速路径。“100% 安全”在这里意味着在整个支持的边界中内存安全,而不是没有逻辑错误、死锁或糟糕的 API。这个边界是难点。Fil-C 目前要求整个程序及其依赖使用其 ABI。该项目还将与普通 C 的互操作性视为非目标。Rust 桥接必须保留这种全局保证,而不是默默地在其中打一个 Yolo 形状的洞。我想要 extern "fil-c" : Rust 在快速路径上,旧 C 在安全路径上,并且有一个完成迁移的性能理由。我还希望看到跨生态系统的协作,而不是几乎兼容的多个岛屿。Fil-C 具有能力模型和有效的运行时。Rust 具有编译时安全。Zig 正在探索 Fil-C 启发的 ABI。Nix 和 filnix 可以重建和测试完整的依赖图。这个问题值得来自四个社区的最佳人才在同一个房间里讨论。所以这里是邀请:明年在 Lanzarote 的 OceanSprint 与我们共同建设。正在构建 filnix 的 Mikael Brockman 已经接受了。这是谁和我们一起加入的?

赞助内容

NordVPN Next-gen Antivirus

本站免费、广告极少。如果觉得有帮助,可以请我们喝杯咖啡 —— 任何金额都对持续运营有实际帮助。

请我喝杯咖啡