embedded-wasm-apps
Run native, statically-compiled apps on any platform, using WebAssembly.
Examples include AssemblyScript,
Rust,
C/C++,
TinyGo,
Zig,
etc.
How it works
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
Benefits
- 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 (~50% slowdown)
- Moderate binary size increase
- Highly portable
Example
$ 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!
WASM
apps
Building Ensure WABT
and Binaryen
tools are in your PATH
.
# AssemblyScript (needs Node.js)
cd apps/assemblyscript
npm install
cd ../..
make APP=assemblyscript
# Rust
rustup target add wasm32-unknown-unknown
make APP=rust
# C/C++ (needs wasienv)
make APP=cpp
# TinyGo (needs TinyGo v0.21.0 and Go v1.17.3)
make APP=tinygo
# Zig (needs Zig v0.9.0)
make APP=zig
PlatformIO
Building and running with # 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
Particle
Building and running with Requires particle-cli
.
Should work on all Particle devices i.e. Spark Core
, Photon
, Electron
, Argon
, Boron
:
particle flash MyDevice ./src/
# Open serial monitor
particle serial monitor --follow
License
This project is released under The MIT License (MIT)