So you want to be a compiler wizard (2016)
Some other good projects:<p>* Lambda calculus evaluator<p>* Hindley Milner typechecker for lambda calculus<p>* Stack based calculator (extend with variables)<p>* Play around with macros<p>* Work through Crafting Interpreters<p>But really in my experience the best way to get better at compilers (I can't claim to be a wizard) is to just build a goddamn compiler. Start by writing a parser (you can crib from Crafting Interpreters), writing the simplest possible typechecker for arithmetic (crib from Hindley Milner), then a code generator to whatever target you want. Code generation is tricky, but if you're generating arithmetic, it's really not that bad.<p>If at any point you get confused or have no clue what to do, take a deep breath and guess! Yep, just guess how to do it. I've done this quite a few times and later learned that my guess was really a dumbed down version of idk, solving the AST typing problem, or lambda lifting, or whatever. If that's too hard, scroll through other compilers and figure out what they do.<p>Once you get something working, celebrate! It's pretty cool seeing even arithmetic end up as code generated and run.<p>Then start adding other features! Add local variables. Add nested functions. Add whatever.<p>The secret is to treat a compiler as a challenging software development project. Because that's what it is. Start writing code and figure it out.<p>Granted this is not great advice if you want a usable compiler at the end. I'm just trying to learn, not make something for people to use.