Run native, statically-compiled apps on any platform, using WebAssembly.
Examples include AssemblyScript,
Rust,
C/C++,
TinyGo,
Zig,
Virgil,
WAT,
etc.
This does not use Wasm3
engine. The approach is similar to WasmBoxC
or RLBox
:
- Compile source code to
wasm
- Translate
wasm
toC
usingwasm2c
- Compile produced
C
, link with a thin runtime implementation using the native platform toolchain
- Language/toolchain decoupling
- Resilience against attacks (RCE, Control-flow hijacking)
- Sandboxing / SFI (Software Fault Isolation)
- Enables wasm transformations, like instrumentation or
gas metering
- Software-based memory virtualization
- Moderate runtime overhead (mostly depends on the source language/runtime)
- Small performance hit (~10-30% slowdown compared to native modules)
- Moderate binary size increase
- Highly portable
$ make APP=rust
Finished release [optimized] target(s) in 0.00s
$ pio run -e esp32 -t upload
$ pio device monitor
Initializing WebAssembly...
π¦ Rust is running!
$ make APP=assemblyscript
> npm run asbuild:optimized
$ pio run -e esp32 -t upload
$ pio device monitor
Initializing WebAssembly...
π AssemblyScript is running!
$ make APP=tinygo
$ pio run -e esp32 -t upload
$ pio device monitor
Initializing WebAssembly...
π€ TinyGo is running!
Ensure the required tools are in your PATH
:
# AssemblyScript v0.27 (needs Node.js) make APP=assemblyscript # Rust 1.80.1 rustup target add wasm32-unknown-unknown make APP=rust # C/C++ (needs Clang) make APP=cpp # C99 Coremark (needs Clang) make APP=coremark # TinyGo v0.33.0 + Go v1.23.0 make APP=tinygo # Zig v0.13.0 make APP=zig # Virgil (Aeneas III-7.1632) make APP=virgil # WAT make APP=wat
Resulting WASM file comparison:
AS | C/C++ | Coremark | Rust | TinyGo | Virgil | WAT | Zig |
---|---|---|---|---|---|---|---|
3951 | 864 | 10800 | 12264 | 1227 | 315 | 223 | 1057 |
# For ESP32: pio run -e esp32 -t upload # For ESP8266: pio run -e esp8266 -t upload # For Raspberry Pi Pico: pio run -e rpi-pico -t upload # Open serial monitor pio device monitor --quiet
Requires particle-cli
.
Should work on all Particle devices i.e. Spark Core
, Photon
, Electron
, Argon
, Boron
, P2 / Photon2
:
particle flash MyDevice ./src/* # Open serial monitor particle serial monitor --follow
This project is released under The MIT License (MIT)