Rust 的 WASI 目标变更

2024年4月9日 · Yosh Wuyts

WASI 0.2 最近已稳定下来,并且 Rust 已开始以专用的新目标的形式为其实现一流支持。Rust 1.78 将引入新的 wasm32-wasip1(二级)和 wasm32-wasip2(三级)目标。wasm32-wasip1 实际上是对现有 wasm32-wasi 目标的重命名,从而为最终的 WASI 1.0 版本释放了目标名称。从 Rust 1.78(2024年5月2日)开始,建议 WASI 0.1 的用户在 Rust 1.84(2025年1月5日)中移除现有 wasm32-wasi 目标之前,开始迁移到新的 wasm32-wasip1 目标。

在本文中,我们将讨论新目标的引入、其背后的动机、这对现有 WASI 目标意味着什么,以及这些变更的详细时间表。本文仅讨论 WASI 目标;现有 wasm32-unknown-unknownwasm32-unknown-emscripten 目标不受本文任何变更的影响。

引入 wasm32-wasip2

经过近五年的努力,WASI 0.2 规范最近已稳定下来。这项工作建立在WebAssembly 组件之上(可以理解为:Wasm 的强类型 ABI),提供异步 IO、网络和 HTTP 等功能的标准接口。这最终将使得在 WASI 之上编写异步网络服务成为可能,而这是使用 WASI 0.1 无法实现的。

今天有兴趣将 Rust 代码编译到 WASI 0.2 的人可以使用 cargo-component 工具来实现。该工具能够获取 WASI 0.1 二进制文件,并使用垫片(shim)将它们转换为 WASI 0.2 组件。它还为常见的 Cargo 命令(例如 cargo buildcargo testcargo run)提供原生支持。虽然由于额外的转换层会引入一些效率低下,但在实践中这已经运行得非常好,人们应该能够开始进行 WASI 0.2 的开发。

然而,我们渴望开始淘汰那个转换层。因此,我们很高兴分享 Rust 通过在 Rust 1.78 中引入三级 wasm32-wasip2 目标迈出了第一步。该目标最初会缺少许多预期功能,例如 stdlib 支持,而且我们目前不建议人们使用此目标。但随着我们在未来几个月内补充这些缺失的功能,我们的目标是最终满足成为二级目标的标准,届时 wasm32-wasip2 目标将被视为可供普遍使用。这项工作将在 2024 年全年进行,我们预计它将在年末之前完成。

wasm32-wasi 重命名为 wasm32-wasip1

我们现在称为 WASI 0.1 的原始名称是 "WebAssembly System Interface, snapshot 1"。Rust 在 2019 年发布了对此的支持,当时我们知道该目标未来可能会经历重大变更。然而,凭借我们今天的知识,我们当初就不会选择将 "WASI, snapshot 1" 目标引入为 wasm32-wasi。我们当初应该选择在初始目标三元组中添加一些后缀,以便最终的稳定版 WASI 1.0 目标可以直接称为 wasm32-wasi

为了预见最终的 WASI 1.0 目标,并保持目标名称之间的一致性,我们将开始对现有的 WASI 0.1 目标推出名称变更。从 Rust 1.78(2024年5月2日)开始,新的 wasm32-wasip1 目标将可用。从 Rust 1.81(2024年9月5日)开始,我们将开始警告现有 wasm32-wasi 的用户迁移到 wasm32-wasip1。最后,在 Rust 1.84(2025年1月9日)中,wasm32-wasi 目标将不再随稳定发布渠道一同提供。这将为项目提供一个 8 个月的过渡期,以便在更新其 Rust 工具链时切换到新的目标名称。

名称 wasip1 可以读作 "WASI (zero) point one" 或 "WASI preview one"。官方规范使用“preview”的名称,但在大多数交流中,现在更倾向于使用“WASI 0.1”的形式。选择这个目标三元组不仅是因为它映射了这两个术语,还因为它更接近其他编程语言中使用的目标术语。这是 WASI Preview 2 规范也提及的一点。

时间线

下表提供了将目标从 wasm32-wasi 重命名为 wasm32-wasip1 的日期和截止时间。表中的日期不适用于新引入的 wasm32-wasi-preview1-threads 目标;它将在 Rust 1.78 中直接重命名为 wasm32-wasip1-threads,无需经过过渡期。三级 wasm32-wasip2 目标也将在 Rust 1.78 中可用。

日期Rust 稳定版Rust Beta版Rust 每夜版备注
2024-02-081.761.771.78wasm32-wasip1 在每夜版中可用
2024-03-211.771.781.79wasm32-wasip1 在 Beta 版中可用
2024-05-021.781.791.80wasm32-wasip1 在稳定版中可用
2024-06-131.791.801.81在每夜版中使用 wasm32-wasi 时警告
2024-07-251.801.811.82在 Beta 版中使用 wasm32-wasi 时警告
2024-09-051.811.821.83在稳定版中使用 wasm32-wasi 时警告
2024-10-171.821.831.84wasm32-wasi 在每夜版中不可用
2024-11-281.831.841.85wasm32-wasi 在 Beta 版中不可用
2025-01-091.841.851.86wasm32-wasi 在稳定版中不可用

结论

在本文中,我们讨论了 Rust 的 WASI 目标的即将到来的更新。随着 Rust 1.78 的到来,将添加 wasm32-wasip1(二级)和 wasm32-wasip2(三级)目标。在 Rust 1.81 中,如果使用了 wasm32-wasi,我们将开始发出警告。在 Rust 1.84 中,现有的 wasm32-wasi 目标将被移除。这将释放 wasm32-wasi 名称,以便最终用于 WASI 1.0 目标。用户在更新其 Rust 工具链时将有 8 个月的过渡期切换到新的目标名称。

wasm32-wasip2 目标标志着对 WASI 0.2 的原生支持的开始。要在今天从 Rust 针对该目标进行开发,建议人们使用 cargo-component 工具。计划是最终将 wasm32-wasip2 提升到二级目标,届时 cargo-component 将升级为原生支持它。

随着 WASI 0.2 最终稳定,对于 WebAssembly 开发来说,这是一个令人兴奋的时刻。我们很高兴 Rust 开始实现对 WASI 0.2 的原生支持,并且我们对这将使人们能够构建什么感到兴奋。