内容提要
Rust将WASI 0.2目标更名为wasm32-wasip1,并引入了新的wasm32-wasip2目标。从Rust 1.81开始,wasm32-wasip2将作为tier-2目标提供。这意味着它现在可以保证构建,并可通过Rustup进行预构建目标的安装。这也意味着生态系统的crate可以直接针对WASI 0.2进行平台特定代码的编写。但是,WASI 0.2目前仍然不完整,特别是stdlib支持有限。建议使用wasi crate或wit-bindgen生成自己的WASI规范绑定。预计在今年和明年逐步扩展Rust stdlib对WASI 0.2 API的支持。
延伸解读
从 Tier 3 到 Tier 2 的意义
wasm32-wasip2 从 Tier 3 升级为 Tier 2,意味着 Rust 官方保证该目标能够构建,并且用户可以通过 rustup 直接安装预构建的标准库。这降低了开发者尝试 WASI 0.2 的门槛,不再需要依赖第三方工具链或自行编译。对于生态而言,稳定的 Tier 2 平台是 crate 作者添加平台特定代码的前提,因此这一变化可能加速 WASI 0.2 相关库的出现。
工具链与开发方式的转变
此前开发 Wasm 组件通常使用 cargo-component 等工具,先编译到 wasm32-wasip1,再通过后处理打包成 WASI 0.2 组件。现在工具链可以直接以 wasm32-wasip2 为目标,省去额外的兼容层或后处理步骤。这简化了构建流程,也减少了因中间步骤引入的潜在问题,使开发者能更直接地利用 WASI 0.2 的接口。
网络编程等新能力的开放
WASI 0.1 不支持套接字,而 WASI 0.2 提供了相应的接口。随着 wasm32-wasip2 成为稳定的 Tier 2 目标,crate 作者可以开始编写针对 WASI 0.2 的网络代码,使用 cfg 属性区分平台。这为在 WebAssembly 环境中实现网络功能打开了大门,但具体实现仍需依赖 wasi crate 或 wit-bindgen 生成的绑定,因为标准库支持尚不完整。
当前局限与应对建议
尽管 wasm32-wasip2 已进入 Tier 2,但 WASI 0.2 本身仍不完整,尤其是 Rust 标准库对其 API 的支持有限。官方建议直接使用 wasi crate(相当于 WASI 的 libc)或通过 wit-bindgen 生成自定义绑定来访问平台原生功能。预计标准库支持将在今年和明年逐步扩展,例如 std::net 的原生支持已开始合并,但现阶段开发者需做好手动处理底层接口的准备。
Q&A
wasm32-wasip2目标的主要变化是什么?
wasm32-wasip2目标从Rust 1.81开始作为tier-2目标提供,保证构建并可通过Rustup安装。
如何在Rust中使用wasm32-wasip2目标?
可以通过命令'rustup target add wasm32-wasip2'来安装wasm32-wasip2目标。
WASI 0.2目前的支持情况如何?
WASI 0.2目前仍不完整,特别是stdlib支持有限。
生态系统的crate如何针对WASI 0.2编写代码?
生态系统的crate可以直接针对WASI 0.2编写平台特定代码,尤其是网络代码。
推荐使用哪些工具来生成WASI规范绑定?
建议使用wasi crate或wit-bindgen生成自己的WASI规范绑定。
Rust stdlib对WASI 0.2 API的支持计划是什么?
预计Rust stdlib对WASI 0.2 API的支持将在今年和明年逐步扩展。