- Tiny: TinyWasm is designed to be as small as possible without significantly compromising performance or functionality (< 4000 LLOC).
- Portable: TinyWasm runs on any platform that Rust can target, including
no_std
, with minimal external dependencies. - Safe: No unsafe code is used in the runtime (
rkyv
which uses unsafe code can be used for serialization, but is optional).
TinyWasm passes all WebAssembly MVP tests from the WebAssembly core testsuite and is able to run most WebAssembly programs. Additionally, the current 2.0 Draft is mostly supported, with the exception of Fixed-Width SIMD and Memory64/Multiple Memories. See the Supported Proposals section for more information.
Legend
🌑 -- not available
🚧 -- in development / partialy supported
🟢 -- fully supported
Proposal | Status | TinyWasm Version |
---|---|---|
Mutable Globals | 🟢 | 0.2.0 |
Non-trapping float-to-int Conversion | 🟢 | 0.2.0 |
Sign-extension operators | 🟢 | 0.2.0 |
Multi-value | 🟢 | 0.2.0 |
Bulk Memory Operations | 🟢 | 0.4.0 |
Reference Types | 🟢 | 0.7.0 |
Multiple Memories | 🟢 | 0.8.0 |
Custom Page Sizes | 🟢 | next |
Memory64 | 🚧 | N/A |
Fixed-Width SIMD | 🌑 | N/A |
See the examples directory and documentation for more information on how to use TinyWasm.
For testing purposes, you can also use the tinywasm-cli
tool:
$ cargo install tinywasm-cli
$ tinywasm-cli --help
std
Enables the use ofstd
andstd::io
for parsing from files and streams. This is enabled by default.logging
Enables logging using thelog
crate. This is enabled by default.parser
Enables thetinywasm-parser
crate. This is enabled by default.archive
Enables pre-parsing of archives. This is enabled by default.
With all these features disabled, TinyWasm only depends on core
, alloc
,and libm
and can be used in no_std
environments.
Since libm
is not as performant as the compiler's math intrinsics, it is recommended to use the std
feature if possible (at least for now), especially on wasm32 targets.
Big thanks to the authors of the following projects, which have inspired and influenced TinyWasm:
- wasmi - an efficient and lightweight WebAssembly interpreter that also runs on
no_std
environments - wasm3 - a high performance WebAssembly interpreter written in C
- wazero - a zero-dependency WebAssembly interpreter written in go
- wain - a zero-dependency WebAssembly interpreter written in Rust
I encourage you to check these projects out if you're looking for more mature and feature-complete WebAssembly Runtimes.
Licensed under either of Apache License, Version 2.0 or MIT license at your option.
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in TinyWasm by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.
Note: The GitHub repository contains a Submodule (crates/tinywasm-parser/data
) which is licensed only under the Apache License, Version 2.0. This data is generated from the WebAssembly Specification and is only used for testing purposes and not included in the final binary.