Skip to content

Commit 39ea641

Browse files
authored
Expand doc section about "what about #![no_std]?" (#2024)
* Expand doc section about "what about `#![no_std]`?" This commit expands the `#![no_std]` section of the documentation with an FAQ-style set of words which explains in more detail about why we don't support `#![no_std]` at this time, and how we can support it in the future. * Review comments * Add some more words about -Zbuild-std
1 parent e70f732 commit 39ea641

File tree

1 file changed

+95
-0
lines changed

1 file changed

+95
-0
lines changed

docs/stability-platform-support.md

+95
Original file line numberDiff line numberDiff line change
@@ -42,3 +42,98 @@ cases for for what `#[no_std]` might entail, so if you're interested in this
4242
we'd love to hear about your use case! Feel free to [open an
4343
issue](https://github.com/bytecodealliance/wasmtime/issues/new) on the
4444
`wasmtime` repository to discuss this.
45+
46+
This is a common question we are asked, however, so to provide some more context
47+
on why Wasmtime is the way it is, here's some responses to frequent points
48+
raised about `#![no_std]`:
49+
50+
* **What if my platform doesn't have `std`?** - For platforms without support
51+
for the Rust standard library the JIT compiler of Wasmtime often won't run on
52+
the platform as well. The JIT compiler requires `mmap` (or an equivalent), and
53+
presence of `mmap` often implies presence of a libc which means Rust's `std`
54+
library works.
55+
56+
Cargo's [`-Z build-std` feature][zbuild-std] feature is also intended to help
57+
easily build the standard library for all platforms. With this feature you can
58+
recompile the standard library (using Nightly Rust for now) with a [custom
59+
target specification][custom-target] if necessary. Additionally the intention
60+
at this time is to get `std` building for all platforms, regardless of what
61+
the platform actually supports. This change is taking time to implement, but
62+
[rust-lang/rust#74033] is an example of this support growing over time.
63+
64+
We're also interested in running Wasmtime without a JIT compiler in the
65+
future, but that is not implemented at this time. Implementing this will
66+
require a lot more work than tagging crates `#![no_std]`. The Wasmtime
67+
developers are also very interested in supporting as many targets as possible,
68+
so if Wasmtime doesn't work on your platform yet we'd love to learn why and
69+
what we can do to support that platform, but the conversation here is
70+
typically more nuanced than simply making `wasmtime` compile without `std`.
71+
72+
* **Doesn't `#![no_std]` have smaller binary sizes?** - There's a lot of factors
73+
that affect binary size in Rust. Compilation options are a huge one but beyond
74+
that idioms and libraries linked matter quite a lot as well. Code is not
75+
inherently large when using `std` instead of `core`, it's just that often code
76+
using `std` has more dependencies (like `std::thread`) which requires code to
77+
bind. Code size improvements can be made to code using `std` and `core`
78+
equally, and switching to `#![no_std]` is not a silver bullet for compile
79+
sizes.
80+
81+
* **The patch to switch to `#![no_std]` is small, why not accept it?** - PRs to
82+
switch to `#![no_std]` are often relatively small or don't impact too many
83+
parts of the system. There's a lot more to developing a `#![no_std]`
84+
WebAssembly runtime than switching a few crates, however. Maintaining a
85+
`#![no_std]` library over time has a number of costs associated with it:
86+
87+
* Rust has no stable way to diagnose `no_std` errors in an otherwise `std`
88+
build, which means that to supoprt this feature it must be tested on CI with
89+
a `no_std` target. This is costly in terms of CI time, CI maintenance, and
90+
developers having to do extra builds to avoid CI errors. Note that this
91+
isn't *more* costly than any other platform supported by Wasmtime, but it's
92+
a cost nonetheless.
93+
94+
* Idioms in `#![no_std]` are quite different than normal Rust code. You'll
95+
import from different crates (`core` instead of `std`) and data structures
96+
have to all be manually imported from `alloc`. These idioms are difficult to
97+
learn for newcomers to the project and are not well documented in the
98+
ecosystem. This cost of development and maintenance is not unique to
99+
Wasmtime but in general affects the `#![no_std]` ecosystem at large,
100+
unfortunately.
101+
102+
* Currently Wasmtime does not have a target use case which requires
103+
`#![no_std]` support, so it's hard to justify these costs of development.
104+
We're very interested in supporting as many use cases and targets as
105+
possible, but the decision to support a target needs to take into account
106+
the costs associated so we can plan accordingly. Effectively we need to have
107+
a goal in mind instead of taking on the costs of `#![no_std]` blindly.
108+
109+
* At this time it's not clear whether `#![no_std]` will be needed long-term,
110+
so eating short-term costs may not pay off in the long run. Features like
111+
Cargo's [`-Z build-std`][zbuild-std] may mean that `#![no_std]` is less and
112+
less necessary over time.
113+
114+
* **How can Wasmtime support `#![no_std]` if it uses X?** - Wasmtime as-is today
115+
is not suitable for many `#![no_std]` contexts. For example it might use
116+
`mmap` for allocating JIT code memory, leverage threads for caching, or use
117+
thread locals when calling into JIT code. These features are difficult to
118+
support in their full fidelity on all platforms, but the Wasmtime developers
119+
are very much aware of this! Wasmtime is intended to be configurable where
120+
many of these features are compile-time or runtime options. For example caches
121+
can be disabled, JITs can be removed and replaced with interpreters, or users
122+
could provide a callback to allocate memory instead of using the OS.
123+
This is sort of a long-winded way of saying that Wasmtime on the surface may
124+
today look like it won't support `#![no_std]`, but this is almost always
125+
simply a matter of time and development priorities rather than a fundamental
126+
reason why Wasmtime *couldn't* support `#![no_std]`.
127+
128+
Note that at this time these guidelines apply not only to Wasmtime but also to
129+
some of its dependencies developed by the Bytecode Alliance such as the
130+
[wasm-tools repository](https://github.com/bytecodealliance/wasm-tools). These
131+
projects don't have the same runtime requirements as Wasmtime (e.g. `wasmparser`
132+
doesn't need `mmap`), but we're following the same guidelines above at this
133+
time. Patches to add `#![no_std]`, while possibly small, incur many of the same
134+
costs and also have an unclear longevity as features like [`-Z
135+
build-std`][zbuild-std] evolve.
136+
137+
[zbuild-std]: https://doc.rust-lang.org/nightly/cargo/reference/unstable.html#build-std
138+
[custom-target]: https://doc.rust-lang.org/rustc/targets/custom.html
139+
[rust-lang/rust#74033]: https://github.com/rust-lang/rust/pull/74033

0 commit comments

Comments
 (0)