Muni compiler frontend targeting WebAssembly
Project description
muni2wasm
A compiler that turns Muni source code into WebAssembly.
- Written in Python, ships with a CLI
- No system tools required — uses the Python WABT package to assemble
- Optional: run the resulting
.wasmwith Wasmtime (Python binding)
Table of contents
Installation
pip install muni2wasm
Python 3.10+ recommended.
Quick start
# Compile .mun → .wasm
muni2wasm compile hello.mun out.wasm
# Run .wasm (requires wasmtime)
muni2wasm run out.wasm
Use --debug to see full Python tracebacks on errors.
The Muni language
Types
- Primitives:
int,boolean,char - Special:
void(functions that don’t return a value) - Generic array:
array<T> - User types:
structure(fields + methods, can be generic)
Internally targets WebAssembly i32 for now.
Structures & generics
structure List<T> {
T element;
List<T> next;
List<T>(T element) { # constructor
this.element = element;
this.next = null;
}
void append(T element) {
List<T> cur = this;
while (cur.next != null) {
cur = cur.next;
}
cur.next = List<T>(element);
}
}
void main() {
List<int> xs = List<int>(3);
xs.append(4);
}
Type aliases
alias numbers = array<int>;
alias index<T> = pair<int, T>;
Control flow
if / elsefor (init; cond; post) { ... }while (cond) { ... }until (cond) { ... }do <X> { ... } <while (cond)>
Operators
- Arithmetic:
+ - * / %(ints) - Comparisons:
> < >= <= == !=(mostly ints) - Logical:
&& || ! - Unary:
-(negate),!(not)
Literals
123
true / false
'x' # char
"hello!\n" # string
[1, 2, 3] # array literal
null
Imports
- File imports (inlines another
.munfile; path is relative):
import <vector.mun>;
- Library imports (inlines a library file)
import <math.lib>; # imports the math.mun lib
- Host imports (declare a host function available at runtime):
import env.write_int(int) -> void;
import env.write_chr(int) -> void;
Strings
string is an alias for vec<char> (and char is just an alias for int).
vec<T>is structure that represents a growable vector aroundarray<T>withsize,capacity,get,set,push_back, …array<T>layout is{ length, buffer_ptr }in linear memory.
The standard helpers live in lib/std.mun (e.g., the definition of vec, a print(string) that calls the host env.write_chr per character).
CLI
muni2wasm compile <input.mun> <output.(wat|wasm)> [--debug]
muni2wasm run <module.wasm> [--debug]
-
compileemits.wator.wasm(based on the output suffix), assembling via Python WABT. -
runloads the module with Wasmtime and wires a minimal host environment:env.write_int(i32)— print integerenv.write_chr(i32)— print a single character code (ASCII/UTF-8 byte)
You can define your own host imports and call them from Muni via
import module.name(...) -> ...;.
Notes
- Currently uses i32 only (no floats yet).
charis anintunder the hood; escape sequences like'\n'are supported.- Strings are
vec<char>; printing strings typically iterates chars and callswrite_chr. - Type aliases are expanded before type-checking; generic arity is validated.
- Diagnostics include
file:line:col.
Contributing
PRs and discussions welcome! Ideas & roadmap:
- Add
f32 - Better diagnostics
- More stdlib (strings, I/O helpers)
- JS/Web runner
- Lambdas / closures (and lambda lifting)
- More tests
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file muni2wasm-0.1.2.post0.tar.gz.
File metadata
- Download URL: muni2wasm-0.1.2.post0.tar.gz
- Upload date:
- Size: 37.5 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9cbb326b77ccd02df63eb195cb6cf333d078ae7d3152c901b6f162dcc3e35927
|
|
| MD5 |
6e5a1be996dcf239a3227d76f42f9387
|
|
| BLAKE2b-256 |
36e19bc9ebe1f2a752e4695ff11c57dcda572eea4628f25396f9bbac4b21e9eb
|
File details
Details for the file muni2wasm-0.1.2.post0-py3-none-any.whl.
File metadata
- Download URL: muni2wasm-0.1.2.post0-py3-none-any.whl
- Upload date:
- Size: 38.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8242e54b598fd8e3a973f26cada8ac74a18b89ffcde9a55f977299d3e3e92e20
|
|
| MD5 |
b2cc066af85ccfdcd69dec4023a72099
|
|
| BLAKE2b-256 |
04274d4baa3dbe659e7d05af78e994ce71811452c25dafda6b79ad7e7a2484fc
|