Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blog post: Changes to Rust's WASI targets #1302

Merged
merged 5 commits into from
Apr 9, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
120 changes: 120 additions & 0 deletions posts/2024-04-09-updates-to-rusts-wasi-targets.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,120 @@
---
layout: post
title: Changes to Rust's WASI targets
author: Yosh Wuyts
---

[WASI 0.2 was recently
stabilized](https://bytecodealliance.org/articles/WASI-0.2), and Rust has begun
implementing first-class support for it in the form of a dedicated new target.
Rust 1.78 will introduce new `wasm32-wasip1` (tier 2) and `wasm32-wasip2` (tier
3) targets. `wasm32-wasip1` is an effective rename of the existing `wasm32-wasi`
target, freeing the target name up for an eventual WASI 1.0 release. **Starting
Rust 1.78 (May 2nd, 2024), users of WASI 0.1 are encouraged to begin migrating
to the new `wasm32-wasip1` target before the existing `wasm32-wasi` target is
removed in Rust 1.84 (January 5th, 2025).**

In this post we'll discuss the introduction of the new targets, the motivation
behind it, what that means for the existing WASI targets, and a detailed
schedule for these changes. This post is about the WASI targets only; the
existing `wasm32-unknown-unknown` and `wasm32-unknown-emscripten` targets are
unaffected by any changes in this post.

## Introducing `wasm32-wasip2`

After nearly five years of work the [WASI 0.2 specification](https://wasi.dev)
was recently stabilized. This work builds on [WebAssembly
Components](https://component-model.bytecodealliance.org) (think: strongly-typed
ABI for Wasm), providing standard interfaces for things like asynchronous IO,
networking, and HTTP. This will finally make it possible to write asynchronous
networked services on top of WASI, something which wasn't possible using WASI
0.1.

People interested in compiling Rust code to WASI 0.2 today are able to do so
using the [cargo-component](https://github.com/bytecodealliance/cargo-component)
tool. This tool is able to take WASI 0.1 binaries, and transform them to WASI 0.2
Components using a shim. It also provides native support for common cargo
commands such as `cargo build`, `cargo test`, and `cargo run`. While it
introduces some inefficiencies because of the additional translation layer, in
practice this already works really well and people should be enough able to get
started with WASI 0.2 development.

We're however keen to begin making that translation layer obsolete. And for
that reason we're happy to share that Rust has made its first steps towards
that with the introduction of the [tier
3](https://doc.rust-lang.org/rustc/platform-support.html#tier-3) `wasm32-wasip2`
target landing in Rust 1.78. **This will initially miss a lot of expected**
**features such as stdlib support, and we don't recommend people use this target**
**quite yet.** But as we fill in those missing features over the coming months, we
aim to eventually hit meet the criteria to become a tier 2 target, at which
point the `wasm32-wasip2` target would be considered ready for general use. This
work will happen through 2024, and we expect for this to land before the end of
the calendar year.

## Renaming `wasm32-wasi` to `wasm32-wasip1`

The original name for what we now call WASI 0.1 was "WebAssembly System
Interface, snapshot 1". Rust shipped support for this in 2019, and we did so
knowing the target would likely undergo significant changes in the future. With
the knowledge we have today though, we would not have chosen to introduce the
"WASI, snapshot 1" target as `wasm32-wasi`. We should have instead chosen to add
some suffix to the initial target triple so that the eventual stable WASI 1.0
target can just be called `wasm32-wasi`.

In anticipation of both an eventual WASI 1.0 target, and to preserve consistency
between target names, we'll begin rolling out a name change to the existing WASI
0.1 target. Starting in Rust 1.78 (May 2nd, 2024) a new `wasm32-wasip1` target
will become available. Starting Rust 1.81 (September 5th, 2024) we will begin
warning existing users of `wasm32-wasi` to migrate to `wasm32-wasip1`. And
finally in Rust 1.84 (January 9th, 2025) the `wasm32-wasi` target will no longer
be shipped on the stable release channel. This will provide an 8 month
transition period for projects to switch to the new target name when they update
their Rust toolchains.

The name `wasip1` can be read as either "WASI (zero) point one" or "WASI preview
one". The official specification uses the "preview" moniker, however in most
communication the form "WASI 0.1" is now preferred. This target triple was
chosen because it not only maps to both terms, but also more closely resembles
the target terminology used in [other programming
languages](https://go.dev/blog/wasi). This is something the WASI Preview 2
specification [also makes note
of](https://github.com/WebAssembly/WASI/tree/f45e72e5294e990c23d548eea32fd35c80525fd6/preview2#introduction).

## Timeline

This table provides the dates and cut-offs for the target rename from
`wasm32-wasi` to `wasm32-wasip1`. The dates in this table do not apply to the
newly-introduced `wasm32-wasi-preview1-threads` target; this will be renamed to
`wasm32-wasip1-threads` in Rust 1.78 without going through a transition period.
The tier 3 `wasm32-wasip2` target will also be made available in Rust 1.78.

| date | Rust Stable | Rust Beta | Rust Nightly | Notes |
| ---------- | ----------- | --------- | ------------ | ---------------------------------------- |
| 2024-02-08 | 1.76 | 1.77 | 1.78 | `wasm32-wasip1` available on nightly |
| 2024-03-21 | 1.77 | 1.78 | 1.79 | `wasm32-wasip1` available on beta |
| 2024-05-02 | 1.78 | 1.79 | 1.80 | `wasm32-wasip1` available on stable |
| 2024-06-13 | 1.79 | 1.80 | 1.81 | warn if `wasm32-wasi` is used on nightly |
| 2024-07-25 | 1.80 | 1.81 | 1.82 | warn if `wasm32-wasi` is used on beta |
| 2024-09-05 | 1.81 | 1.82 | 1.83 | warn if `wasm32-wasi` is used on stable |
| 2024-10-17 | 1.82 | 1.83 | 1.84 | `wasm32-wasi` unavailable on nightly |
| 2024-11-28 | 1.83 | 1.84 | 1.85 | `wasm32-wasi` unavailable on beta |
| 2025-01-09 | 1.84 | 1.85 | 1.86 | `wasm32-wasi` unavailable on stable |

## Conclusion

In this post we've discussed the upcoming updates to Rust's WASI targets. Come
Rust 1.78 the `wasm32-wasip1` (tier 2) and `wasm32-wasip2` (tier 3) targets will
be added. In Rust 1.81 we will begin warning if `wasm32-wasi` is being used. And
in Rust 1.84, the existing `wasm32-wasi` target will be removed. This will free
up `wasm32-wasi` to eventually be used for a WASI 1.0 target. Users will have 8
months to switch to the new target name when they update their Rust toolchains.

The `wasm32-wasip2` target marks the start of native support for WASI 0.2. In
order to target it today from Rust, people are encouraged to use
[cargo-component](https://github.com/bytecodealliance/cargo-component) tool
instead. The plan is to eventually graduate `wasm32-wasip2` to a tier-2 target,
at which point `cargo-component` will be upgraded to support it natively instead.

With WASI 0.2 finally stable, it's an exciting time for WebAssembly development.
We're happy for Rust to begin implementing native support for WASI 0.2, and
we're excited for what this will enable people to build.