aboutsummaryrefslogtreecommitdiff
path: root/README.md
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi.dcr@tutanota.com>2024-09-07 00:04:38 +0200
committerXavier Del Campo Romero <xavi92@disroot.org>2025-11-06 14:38:40 +0100
commit6d9d80362f9932bbc87e162b8ef7df06c73e27e1 (patch)
treee3e228c63fe26f07503f226de7fb5086b3dc2286 /README.md
First commit
Diffstat (limited to 'README.md')
-rw-r--r--README.md90
1 files changed, 90 insertions, 0 deletions
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..44065a4
--- /dev/null
+++ b/README.md
@@ -0,0 +1,90 @@
+# `nanowasm`, the tiny Wasm interpreter that does not block you
+
+**This project is still unfinished and is not meant for production use.**
+
+This project aims to provide the most minimal Wasm interpreter possible in
+strictly portable ANSI C (C89/C90). It can run one or more Wasm applications
+concurrently, without threading. This project requires the
+[Nanowasm extensions](https://gitea.privatedns.org/xavi/nanowasm-design/)
+to the WebAssembly language. A NanoWasm-compatible program can be built from
+a MVP WebAssembly program with [`nwc`](https://gitea.privatedns.org/xavi/nwc/).
+
+## Features
+
+- Portable **ANSI C** implementation. **Runs on bare metal environments**.
+- **No dependencies** other than an ANSI C (C89/C90) compiler.
+- Asynchronous interface that allows to **run multiple applications**
+**concurrently, without threads**.
+- **I/O-agnostic** implementation for maximum flexibility: read modules
+from a network, write the stack into a file, implement a MMU in software...
+Anything is possible!
+- Suitable for **resource-constrained devices**, such as microcontrollers.
+- **No memory allocator required**.
+- Supports both **big-endian and little-endian architectures**.
+
+### Comparison chart
+
+| Feature | `nanowasm` | [`wasm-micro-runtime`] | [`wasm3`] | [`wac`] | [`toywasm`] |
+| ------- | ------- | ------- | ------- | ------- | ------- |
+| **Asynchronous interface** | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
+| **I/O-agnostic** | ✅ | ❌ | ❌ | ❌ | ❌ | ❌ |
+| **No heap required** | ✅ | ❌ | ❌ | ❌ | ❌ |
+| **Big-endian support** | ✅ | ⚠️ | ✅ | ❌ | ✅ |
+| **No compiler-specific extensions** | ✅ | ❌ | ❌ | ❌ | ❌ |
+| **C dialect** | **`c89`** | `gnu99` | `c99` | `gnu99` | `c11` |
+| **Public functions** | **7** | 156 | 44 | N/A | N/A |
+| **Minimal `.text` footprint** | **49 KiB** | 452 KiB | 519 KiB | N/A | N/A |
+| **Per-module memory usage** | ~1016 bytes | N/A | N/A | N/A | N/A |
+| **Per-instance memory usage** | ~728 bytes | N/A | N/A | N/A | N/A |
+
+Also, see a [detailed explanation](COMPARE.md) behind the numbers above.
+
+## What `nanowasm` is not
+
+As opposed to other interpreters, `nanowasm` prefers lower memory usage
+rather than run-time performance. Therefore, it should not be unfairly
+compared _performance_-wise against other interpreters.
+
+## How to build
+
+Use the conventional process in CMake projects:
+
+```
+cmake -B <dir>
+cmake --build <dir>
+```
+
+## Examples
+
+- [`example/minimal.c`](examples/minimal.c) provides the essential minimum code
+required to work with `nanowasm` i.e., without any imports. This is only meant
+as a starting point for implementations, and not as a standalone program.
+
+- [`example/proc_exit.c`](examples/proc_exit.c) defines the code required to
+support the following minimal C program built with
+[`wasi-sdk`](https://github.com/WebAssembly/wasi-sdk):
+
+```c
+int main()
+{
+ return 0;
+}
+```
+
+## License
+
+```
+nanowasm, a tiny WebAssembly/Wasm interpreter
+Copyright (C) 2023-2025 Xavier Del Campo Romero
+
+This Source Code Form is subject to the terms of the Mozilla Public
+License, v. 2.0. If a copy of the MPL was not distributed with this
+file, You can obtain one at https://mozilla.org/MPL/2.0/.
+```
+
+Also, see [LICENSE](LICENSE).
+
+[`wasm-micro-runtime`]: https://github.com/bytecodealliance/wasm-micro-runtime
+[`wasm3`]: https://github.com/wasm3/wasm3
+[`wac`]: https://github.com/kanaka/wac
+[`toywasm`]: https://github.com/yamt/toywasm