https://github.com/ajeetdsouza/loxcraft
Language tooling for the Lox programming language.
https://github.com/ajeetdsouza/loxcraft
bytecode bytecode-interpreter compiler compiler-construction compiler-design crafting-interpreters hacktoberfest interpreter lalrpop language-server-protocol lox lox-language programming-language repl rust scripting-language tree-sitter virtual-machine webassembly
Last synced: 15 days ago
JSON representation
Language tooling for the Lox programming language.
- Host: GitHub
- URL: https://github.com/ajeetdsouza/loxcraft
- Owner: ajeetdsouza
- License: mit
- Created: 2019-10-16T18:14:35.000Z (over 5 years ago)
- Default Branch: main
- Last Pushed: 2025-02-25T04:14:12.000Z (about 2 months ago)
- Last Synced: 2025-03-31T21:43:46.918Z (22 days ago)
- Topics: bytecode, bytecode-interpreter, compiler, compiler-construction, compiler-design, crafting-interpreters, hacktoberfest, interpreter, lalrpop, language-server-protocol, lox, lox-language, programming-language, repl, rust, scripting-language, tree-sitter, virtual-machine, webassembly
- Language: Rust
- Homepage: https://ajeetdsouza.github.io/loxcraft/
- Size: 770 KB
- Stars: 298
- Watchers: 8
- Forks: 13
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# loxcraft
[](https://crates.io/crates/loxcraft)
**Language tooling** for the **[Lox programming language](http://craftinginterpreters.com/)**.
## Installation
```sh
cargo install loxcraft --locked
```## Features
- [x] Bytecode compiler + garbage collected runtime
- [x] Online playground, via WebAssembly ([try it out!](https://ajeetdsouza.github.io/loxcraft/))
- [x] REPL
- [x] Syntax highlighting, via [tree-sitter-lox](https://github.com/ajeetdsouza/tree-sitter-lox)
- [x] IDE integration, via the [Language Server Protocol](https://microsoft.github.io/language-server-protocol/)## Screenshots


## Benchmarks
Time taken to execute the [benchmark suite](https://github.com/ajeetdsouza/loxcraft/tree/main/res/benchmarks) (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](https://craftinginterpreters.com/) 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](https://journal.stuffwithstuff.com/), and his articles are really well written (see his post on [Pratt parsers](https://journal.stuffwithstuff.com/2011/03/19/pratt-parsers-expression-parsing-made-easy/) / [garbage collectors](https://journal.stuffwithstuff.com/2013/12/08/babys-first-garbage-collector/)). I'd also recommend going through the source code for [Wren](https://wren.io/), 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](https://interpreterbook.com/) / [Writing a Compiler in Go](https://compilerbook.com/) 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](https://lunacookies.github.io/lang/) by Luna Razzaghipour is a fantastic series. Notably, this book constructs its syntax tree using the same library used by [rust-analyzer](https://rust-analyzer.github.io/) ([rowan](https://github.com/rust-analyzer/rowan)).
- [Simple but Powerful Pratt Parsing](https://matklad.github.io/2020/04/13/simple-but-powerful-pratt-parsing.html) 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](https://github.com/Kixiron/rust-langdev) has a lot of libraries for building compilers in Rust. To start off, I'd suggest [logos](https://github.com/maciejhirsz/logos) for lexing, [LALRPOP](https://lalrpop.github.io/lalrpop/) / [chumsky](https://github.com/zesterer/chumsky) for parsing, and [rust-gc](https://github.com/Manishearth/rust-gc) for garbage collection.
- [Learning Rust with Entirely Too Many Linked Lists](https://rust-unofficial.github.io/too-many-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](https://github.com/facebook/starlark-rust) and [Gluon](https://github.com/gluon-lang/gluon).## Contributors
- [Ajeet D'Souza](https://github.com/ajeetdsouza)
- [Kartik Sharma](https://github.com/crazystylus)