nanowasm

A small standalone WebAssembly interpreter in Rust. Currently not really usable, yet.

Goals

This is a hobby project, not intended to be a professional-grade tool. But if it gets to that point, great! I think a small, lightweight interpreter would be really useful for things like embedding, running unit tests on generated wasm code, as an extension system, etc.

The road map is, more or less in order:

Non-goals

Building programs

It's useful to fetch and build wabt, which contains useful low-level tools like an assembler.

``` sudo apt install clang cmake git clone --recursive https://github.com/icefoxen/nanowasm

Or if you've already checked out nanowasm, cd into it and run:

git submodule update --init --recursive

cd nanowasm/spec/wabt make -j$(nproc) ```

The assembler is wat2wasm, so use that.

cd test_programs wat2wasm inc.wast

This should create a inc.wasm program which is what you can actually load and run:

cargo run -- test_programs/inc.wasm

Safety

This should aim for the goal that if a wasm module is invalid, it will return a Result::Err on trying to load or validate it, or construct a program from it. Then actually executing the code should not need to return a Result because it has already been verified correct; things that are incorrect are bugs in the interpreter or verifier and should result in a panic (should we use assert! or debug_assert! here? Depends on the situation; assert! can sometimes lead to the compiler making smarter code, for example eliding bounds checks after one).

One place where this is not possible to statically verify is if you set resource bounds and the program exceeds them. Need to think about this. There may be other places; the wasm test suite should (hopefully) cover these.

Similar projects

Licence

Apache/MIT