safx/zig-tiny-wasm-runtime
A tiny Web Assembly interpreter written in Zig. The interpreter supports Web Assembly Core Specification 2.0
A tiny WebAssembly interpreter written in Zig. This interpreter implements WebAssembly 1.0 core features with selected 2.0 extensions, primarily focusing on SIMD operations. This project is intended for personal understanding of the WebAssembly specification. Do not use in production environment.
# Build the main interpreter
zig build
# Build the spec test runner
zig build spec_test
# Or use the Makefile
make build
make build-spec-test
# Run a WebAssembly binary file
./zig-out/bin/zig-wasm-interp somefile.wasm -r function_name -a 32
# Run with verbose output
./zig-out/bin/zig-wasm-interp somefile.wasm -v -r function_name -a i32:42 -a f64:3.14
# Use the spec test runner for text format files
./zig-out/bin/spec_test test.wast -v
This project uses test files from the spectec repository (WebAssembly 3.0 branch).
Important Note: The current test runner validates that .wast files can be successfully parsed and loaded, but does not execute full test assertions. Therefore, passing all tests indicates syntax compatibility rather than complete feature implementation.
# Download and setup WebAssembly test files
make setup-tests
# This will:
# - Clone the spectec repository (wasm-3.0 branch)
# - Copy .wast test files to wasm_tests/
# - Exclude GC-related tests that require advanced runtime support
# Run all WebAssembly spec tests
make test
# Run specific test file
python3 ./run_spectec_tests.py wasm_tests/address.wast
# Run with verbose output
python3 ./run_spectec_tests.py --verbose wasm_tests/
# Stop on first failure
python3 ./run_spectec_tests.py --failfast wasm_tests/
The codebase is organized into four main modules:
src/core/): WebAssembly types, instructions, and basic structuressrc/decode/): Binary format parsing and module loadingsrc/text_decode/): Text format (.wast/.wat) parsingsrc/validate/): WebAssembly validation rulessrc/runtime/): Execution engine and interpreter# Development
make help # Show available commands
make build # Build the interpreter
make build-spec-test # Build spec test runner
make clean # Clean all build artifacts
# Testing
make setup-spectec # Clone/update spectec repository
make setup-tests # Setup WebAssembly 2.0 test files
make test # Run WebAssembly spec tests
make clean-tests # Remove test files
# Manual testing
zig build test # Run unit tests
zig fmt src/ # Format source code
This interpreter implements WebAssembly 1.0 core specification with selected 2.0 extensions. The test suite shows 237/237 test files successfully parsed, though full feature execution is limited to implemented instructions.
Vector/SIMD Instructions (Fixed-Width 128-bit)
Relaxed SIMD Instructions
Bulk Memory Operations
memory.copy - Fast memory-to-memory copyingmemory.fill - Memory initialization with byte valuesmemory.init - Initialize memory from passive data segmentsdata.drop - Drop passive data segmentsReference Types (Basic)
funcref and externref typesref.null, ref.func, ref.is_null instructionstable.get, table.set, table.init, table.copy, table.grow, table.size, table.fillNon-Trapping Float-to-Int Conversions
i32.trunc_sat_f32_s/u, i32.trunc_sat_f64_s/ui64.trunc_sat_f32_s/u, i64.trunc_sat_f64_s/uSign Extension Instructions
i32.extend8_s, i32.extend16_si64.extend8_s, i64.extend16_s, i64.extend32_sMulti-Value Support
The following WebAssembly 3.0 features are not implemented:
return_call, return_call_indirect, return_call_ref)throw, throw_ref, try_table, exception tags)br_on_null, br_on_non_null, call_ref, ref.as_non_null)These features can be parsed from .wast files but their instructions are not executed.
This is an educational project for understanding WebAssembly internals. Feel free to explore and learn from the code structure.