Skip to content

Latest commit

 

History

History
83 lines (60 loc) · 5.13 KB

README.md

File metadata and controls

83 lines (60 loc) · 5.13 KB

loxcraft

crates.io

Language tooling for the Lox programming language.

Installation

cargo install loxcraft --locked

Features

Screenshots

Screenshot of REPL

Screenshot of online playground

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

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.

Contributors