Rust 的 WASI 目标变更

2024 年 4 月 9 日 · Yosh Wuyts

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-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 已通过引入 第 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-wasiwasm32-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 的原生支持,我们对这将使人们能够构建的内容感到兴奋。