WASI 0.2 最近已稳定发布,Rust 开始以专用新目标的形式实现对它的首要支持。Rust 1.78 将引入新的 wasm32-wasip1
(第 2 层)和 wasm32-wasip2
(第 3 层)目标。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-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 已通过引入 第 3 层 wasm32-wasip2
目标(将在 Rust 1.78 中发布)迈出了第一步。这将最初缺少许多预期的功能,例如 stdlib 支持,我们不建议人们现在就使用这个目标。但是,随着我们在未来几个月内填补这些缺失的功能,我们的目标是最终满足成为第 2 层目标的标准,届时 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 目标进行名称更改。从 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”的形式。选择这个目标三元组是因为它不仅映射到这两个术语,而且更 closely resembles 在 其他编程语言 中使用的目标术语。这是 WASI 预览 2 规范 也提到的。
时间线
此表提供了从 wasm32-wasi
到 wasm32-wasip1
的目标重命名的日期和截止日期。此表中的日期不适用于新引入的 wasm32-wasi-preview1-threads
目标;这将在 Rust 1.78 中重命名为 wasm32-wasip1-threads
,无需经过过渡期。第 3 层 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
(第 2 层)和 wasm32-wasip2
(第 3 层)目标。在 Rust 1.81 中,如果使用 wasm32-wasi
,我们将开始发出警告。在 Rust 1.84 中,将删除现有的 wasm32-wasi
目标。这将释放 wasm32-wasi
,以便最终用于 WASI 1.0 目标。用户将有 8 个月的时间在更新 Rust 工具链时切换到新的目标名称。
wasm32-wasip2
目标标志着对 WASI 0.2 的原生支持的开始。为了今天从 Rust 中针对它,鼓励人们使用 cargo-component 工具。计划是最终将 wasm32-wasip2
升级为第 2 层目标,届时 cargo-component
将升级为原生支持它。
随着 WASI 0.2 最终稳定发布,这是 WebAssembly 开发的激动人心的时刻。我们很高兴 Rust 开始实现对 WASI 0.2 的原生支持,我们对这将使人们能够构建的内容感到兴奋。