on
The Beginning
I'm a language enthusiast. Natural and constructed, computer and human, I love language in all its forms. I particularly love inventing languages. My childhood obsession with conlangs turned into an adult obsession with designing programming languges, and between the two I've spent more hours than I can possibly count tinkering with grammar, syntax, and semantics.
Most of these projects have been the kind that I never quite finish. I have an ambitious idea, work on it for a while, and then I lose interest before wrapping things up tidily. This blog is my attempt to change that.
Inspired by Extra Credits's advice on starting out in game development and a blog post on Minimalism in Programming Language Design, I am going to build a lot of tiny language MVPs to completion. This blog will document my progress through these languages: what I learned, how they work, what works well, what does not. I hope to both gain experience actually finishing projects and to explore the "tiny language" design space to find out what's possible.
Here are my ground rules for this project:
-
Each language will be implemented in Rust and compiled to WebAssembly so that I can embed the interpreter inline with interactive examples.
-
Each language will be scoped down to the smallest interesting feature set possible to explore specific language concepts. At some point I expect to begin building on these minimal prototypes and combining them in interesting ways, but I'm going to begin by restricting myself to one concept at a time.
Here are some examples, in no particular order, of the kinds of languages I plan on implementing:
-
A Forth
-
A concatenative language inspired by Joy and combinatory logic
-
The lambda calculus
-
The join calculus
-
A functional language built around capabilities
-
A Lisp
For my actual work, I lean heavily towards static typing over dynamic typing, but my initial efforts here will likely all be dynamic. It's easier to implement a dynamic interpreter (a type checker has to be written separately), and it's a space I haven't explored much before. Again, as I get further along I may start including type checkers, or going back to previous languages and adding type safety, but to begin with my goal is to have a tiny scope that I can easily finish.