Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/thomscoder/luna
🌙 A really tiny WebAssembly compiler for demonstration and educational purposes. Written in Go and built as one of my quests to conquer the WebAssembly dungeon
https://github.com/thomscoder/luna
codemotion compiler javascript learning learning-by-doing personal-project programming-language runtime sample-code tinygo wasm wasmer wasmtime wat2wasm webassembly
Last synced: 2 months ago
JSON representation
🌙 A really tiny WebAssembly compiler for demonstration and educational purposes. Written in Go and built as one of my quests to conquer the WebAssembly dungeon
- Host: GitHub
- URL: https://github.com/thomscoder/luna
- Owner: thomscoder
- License: mit
- Created: 2022-10-29T08:05:28.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2023-07-20T17:59:50.000Z (over 1 year ago)
- Last Synced: 2024-02-17T09:36:55.823Z (12 months ago)
- Topics: codemotion, compiler, javascript, learning, learning-by-doing, personal-project, programming-language, runtime, sample-code, tinygo, wasm, wasmer, wasmtime, wat2wasm, webassembly
- Language: Go
- Homepage: https://luna-demo.vercel.app
- Size: 1.18 MB
- Stars: 308
- Watchers: 3
- Forks: 6
- Open Issues: 4
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# Luna 🌙
Luna is a reeeaaally tiny, yet expanding, compiler for WebAssembly Text Format, written in Go and built as one of my quest to conquer the WebAssembly dungeon.
(I just wanted to build something like wat2wasm)
It is so tiny that can only make the four operations (addition, subtraction, multiplication and division) with `i32` type numbers.
# Why ❓
I've built Luna because I wanted to learn how to build a compiler while learning WebAssembly.
So Luna was built for DEMONSTRATION and EDUCATIONAL purposes first.The goal of Luna is not to do fancy stuff to replace (in a long distant future) solid tools like wat2wasm, wasmer or others...
The goal of this project is to become a `useful landmark` for anyone approaching WebAssembly and/or for anyone that wants to develop a compiled-to-wasm programming language.
> I tried to document each section of the code as much as I could (I'm still doing it) with link to resources I've studied while building this, but if you want to improve it, feel free to open issues and pull requests.
# How it works ❓
Followed the amazing articles about the Chasm compiler (a WAT compiler written in Typescript for the Chasm language) and a guide to write a WAT compiler in Rust
- Luna takes a `.wat` file (or string if used in the browser)
- Splits it into tokens `./compiler/tokenizer.go`
- Creates a very simple AST of the tokens `./compiler/parser.go`
- Compiles `./compiler/compiler.go`# Use it in the browser 🌐
Luna can also be used in the browsers
Demo: https://luna-demo.vercel.app/
The
```bash
make wasm
```command will build (or update) with TinyGo the `./example/main.wasm` file to be imported in the browser
In the `./example` directory there's a working example of how to do that.> 💡 - `make update` will simply update/replace the existing main.wasm
> 💡 - Check the console to see the tokenizer and the parser outputs
# Aeon Runtime
Luna also implements a really tiny runtime that can run the exported functions.
Read more about it in `./runtime/README.md`# Requirements ✋
- Go
- Tinygo
- Make
- syscall/js set up (or simply comment out the startLuna function and the syscall/js import)# Roadmap
1.
More interactivity
Currently Luna supports only the renaming of the exported function and some order scrumbling2.
More arithmetics
Currently Luna supports only addition3.
Expansion of Wat syntax
# Contributing
To contribute simply
- create a branch with the feature or the bug fix
- open pull requestsLuna is by no means finished there are a lot of things that can be implemented and A LOT of things that can be improved. Any suggestions, pull requests, issues or feedback is greatly welcomed!!!
Per aspera ad astra!