Skip to content

ajeetdsouza/loxcraft

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

87 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

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