@@ -42,3 +42,98 @@ cases for for what `#[no_std]` might entail, so if you're interested in this
4242we'd love to hear about your use case! Feel free to [ open an
4343issue] ( 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