Awesome
<!-- markdownlint-configure-file { "MD033": false, "MD041": false } --> <div align="center">loxcraft
Language tooling for the Lox programming language.
</div>Installation
cargo install loxcraft --locked
Features
- Bytecode compiler + garbage collected runtime
- Online playground, via WebAssembly (try it out!)
- REPL
- Syntax highlighting, via tree-sitter-lox
- IDE integration, via the Language Server Protocol
Screenshots
Benchmarks
Time taken to execute the benchmark suite (lower is better):
Benchmark | loxcraft | clox | jlox |
---|---|---|---|
binary_tree | 8.29s | 8.13s | 26.41s |
equality_1 | 7.17s | 7.73s | 10.01s |
equality_2 | 8.39s | 9.66s | 14.30s |
fib | 10.90s | 10.09s | 21.89s |
instantiation | 10.83s | 12.84s | 14.24s |
invocation | 9.93s | 8.93s | 15.77s |
method_call | 11.01s | 9.12s | 62.03s |
properties | 10.05s | 5.98s | 69.77s |
string_equality_1 | 7.76s | 7.66s | 34.08s |
string_equality_2 | 10.78s | 10.52s | 36.25s |
trees | 9.97s | 8.72s | 72.87s |
zoo | 10.67s | 6.18s | 100.10s |
Benchmarks were run with the following configuration:
- Device: Apple MacBook Pro (16-inch, 2021)
- Processor: M1 Pro
- RAM: 16 GiB
- OS: macOS Ventura 13.2
- Rust: 1.66.1
- Apple Clang: 14.0.0
- Oracle JDK: 19.0.2
References
So you want to build your own programming language! Here's some extremely helpful resources I referred to when building loxcraft
:
- Crafting Interpreters by Bob Nystrom: this book introduces you to a teaching programming language named Lox, walks you through implementing a full-featured tree walking interpreter for in in Java, and then shows you how to build a bytecode compiler + VM for it in C. I cannot recommend this book enough.
- Bob Nystrom also has a blog, and his articles are really well written (see his post on Pratt parsers / garbage collectors). I'd also recommend going through the source code for Wren, it shares a lot of code with Lox. Despite the deceptive simplicity of the implementation, it (like Lox) is incredibly fast - it's a great way to learn how to build production grade compilers in general.
- Writing an Interpreter in Go / Writing a Compiler in Go by Thorsten Ball is a great set of books. Since it uses Go, it piggybacks on Go's garbage collector instead of building one of its own. This simplifies the implementation, making this book a lot easier to grok - but it also means that you may have trouble porting it to a non-GC language (like Rust).
- Make a Language by Luna Razzaghipour is a fantastic series. Notably, this book constructs its syntax tree using the same library used by rust-analyzer (rowan).
- Simple but Powerful Pratt Parsing by Alex Kladov (one of the main authors behind rust-analyzer) is a great tutorial on building a parser in Rust. The rest of his blog is incredible too!
- rust-langdev has a lot of libraries for building compilers in Rust. To start off, I'd suggest logos for lexing, LALRPOP / chumsky for parsing, and rust-gc for garbage collection.
- Learning Rust with Entirely Too Many Linked Lists is a quick tutorial on unsafe Rust, which you'll need if you're building a garbage collector yourself.
- If you want some inspiration for a production-grade language built in Rust, you might want to go through the source code of Starlark and Gluon.