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 的用户开始迁移到新的 wasm32-wasip1
目标,在 Rust 1.84 (2025 年 1 月 5 日) 中删除现有的 wasm32-wasi
目标之前。
在这篇文章中,我们将讨论新目标的引入、其背后的动机、这对现有 WASI 目标意味着什么,以及这些变更的详细时间表。这篇文章仅关于 WASI 目标;现有的 wasm32-unknown-unknown
和 wasm32-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 build
、cargo test
和 cargo run
)提供了原生支持。虽然由于额外的转换层而引入了一些低效率,但实际上它已经运行得很好,人们应该能够开始 WASI 0.2 的开发。
然而,我们渴望开始使该转换层过时。因此,我们很高兴地分享 Rust 已迈出第一步,在 Rust 1.78 中引入了 第三层级 wasm32-wasip2
目标。最初,这将缺少许多预期的功能,例如 stdlib 支持,我们不建议人们现在就使用此目标。 但是,随着我们在未来几个月内填补这些缺失的功能,我们的目标是最终满足成为第二层级目标的标准,届时 wasm32-wasip2
目标将被认为可以投入一般使用。这项工作将在 2024 年进行,我们预计将在年底之前完成。
wasm32-wasi
重命名为 wasm32-wasip1
将 我们现在称为 WASI 0.1 的原始名称是“WebAssembly 系统接口,快照 1”。Rust 在 2019 年发布了对此的支持,并且我们这样做时知道该目标将来可能会发生重大变化。但是,以我们今天所掌握的知识来看,我们不会选择将“WASI,快照 1”目标作为 wasm32-wasi
引入。我们应该选择在初始目标三元组中添加一些后缀,以便最终稳定的 WASI 1.0 目标可以简称为 wasm32-wasi
。
为了预期最终的 WASI 1.0 目标,并保持目标名称之间的一致性,我们将开始将现有 WASI 0.1 目标的名称更改为 wasm32-wasip1
。从 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 (零) 点一” 或 “WASI 预览一”。官方规范使用 “预览” 的称谓,但在大多数交流中,现在首选 “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 测试版 | Rust 每夜版 | 备注 |
---|---|---|---|---|
2024-02-08 | 1.76 | 1.77 | 1.78 | wasm32-wasip1 在每夜版上可用 |
2024-03-21 | 1.77 | 1.78 | 1.79 | wasm32-wasip1 在测试版上可用 |
2024-05-02 | 1.78 | 1.79 | 1.80 | wasm32-wasip1 在稳定版上可用 |
2024-06-13 | 1.79 | 1.80 | 1.81 | 如果在每夜版上使用 wasm32-wasi ,则发出警告 |
2024-07-25 | 1.80 | 1.81 | 1.82 | 如果在测试版上使用 wasm32-wasi ,则发出警告 |
2024-09-05 | 1.81 | 1.82 | 1.83 | 如果在稳定版上使用 wasm32-wasi ,则发出警告 |
2024-10-17 | 1.82 | 1.83 | 1.84 | wasm32-wasi 在每夜版上不可用 |
2024-11-28 | 1.83 | 1.84 | 1.85 | wasm32-wasi 在测试版上不可用 |
2025-01-09 | 1.84 | 1.85 | 1.86 | wasm32-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 实现原生支持,并且我们对这将使人们能够构建的内容感到兴奋。