5 releases (breaking)
0.5.0 | Mar 10, 2024 |
---|---|
0.4.1 | Jan 24, 2024 |
0.4.0 |
|
0.3.0 | Jan 16, 2023 |
0.1.0 | Oct 13, 2022 |
#63 in WebAssembly
265,778 downloads per month
Used in 141 crates
(via gwasmi)
35KB
730 lines
Continuous Integration | Test Coverage | Documentation | Crates.io |
---|---|---|---|
Wasmi - WebAssembly (Wasm) Interpreter
Wasmi is an efficient and lightweight WebAssembly interpreter with a focus on constrained and embedded systems.
Version 0.31.0
has been audited by SRLabs.
Announcement: Transfer of Ownership
As of 2024-02-01, the original owner and maintainer of the Wasmi project, Parity Technologies, has officially transferred ownership of the project to me, Robin Freyler. Read more about this transfer here.
Distinct Features
The following list states some of the distinct features of Wasmi.
- Simple, correct and deterministic execution of WebAssembly.
- Low-overhead and cross-platform WebAssembly runtime for embedded environments.
- JIT bomb resisting translation.
- Loosely mirrors the Wasmtime API.
- 100% WebAssembly spec testsuite compliance.
- Built-in support for fuel metering.
WebAssembly Proposals
The new Wasmi engine supports a variety of WebAssembly proposals and will support even more of them in the future.
WebAssembly Proposal | Status | Comment |
---|---|---|
mutable-global |
✅ | Since version 0.14.0 . |
saturating-float-to-int |
✅ | Since version 0.14.0 . |
sign-extension |
✅ | Since version 0.14.0 . |
multi-value |
✅ | Since version 0.14.0 . |
bulk-memory |
✅ | Since version 0.24.0 . (#628) |
reference-types |
✅ | Since version 0.24.0 . (#635) |
simd |
❌ | Unlikely to be supported. |
tail-calls |
✅ | Since version 0.28.0 . (#683) |
extended-const |
✅ | Since version 0.29.0 . (#707) |
function-references |
📅 | Planned but not yet implemented. (#774) |
gc |
📅 | Planned but not yet implemented. (#775) |
multi-memory |
📅 | Planned but not yet implemented. (#776) |
threads |
📅 | Planned but not yet implemented. (#777) |
relaxed-simd |
❌ | Unlikely to be supported since simd is unlikely to be supported. |
component-model |
📅 | Planned but not yet implemented. (#897) |
WASI | 👨🔬 | Experimental support via the wasmi_wasi crate or the Wasmi CLI application. |
Usage
As CLI Application
Install the newest Wasmi CLI version:
cargo install wasmi_cli
Run wasm32-unknown-unknown
or wasm32-wasi
Wasm binaries:
wasmi_cli <WASM_FILE> --invoke <FUNC_NAME> [<FUNC_ARGS>]*
As Rust Library
Refer to the Wasmi crate docs to learn how to use the Wasmi crate as library.
Development
Build & Test
Clone the Wasmi repository and build using cargo
:
git clone https://github.com/paritytech/wasmi.git --recursive
cd wasmi
cargo build
cargo test
Benchmarks
In order to benchmark Wasmi use the following command:
cargo bench
Use translate
, instantiate
, execute
or overhead
filters to only run benchmarks that test performance of Wasm translation, instantiation, execution or miscellaneous overhead respectively, e.g. cargo bench execute
.
We maintain a timeline for benchmarks of every commit to master
that can be viewed here.
Supported Platforms
Wasmi supports a wide variety of architectures and platforms.
- Fore more details see this list of supported platforms for Rust.
- Note: Wasmi can be used in
no_std
embedded environments, thus not requiring the standard library (std
). - Only some platforms are checked in CI and guaranteed to be fully working by the Wasmi maintainers.
Production Builds
In order to reap the most performance out of Wasmi we highly recommended
to compile the Wasmi crate using the following Cargo profile
:
[profile.release]
lto = "fat"
codegen-units = 1
When compiling for the WebAssembly target we highly recommend to post-optimize
Wasmi using Binaryen's wasm-opt
tool since our experiments displayed a
80-100% performance improvements when executed under Wasmtime and also
slightly smaller Wasm binaries.
License
Licensed under either of
- Apache License, Version 2.0, (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)
- MIT license (LICENSE-MIT or http://opensource.org/licenses/MIT)
at your option.
Contribution
Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.