Might I offer a suggestion? I would argue that most of the work that goes into a compiler is not the front-end functionality but rather the "middle-" and back-end functionality, i.e. making the generated code fast. It would be very insightful to those outside the compilers community as to what it's actually like to work on one to go over the basic optimizations, such as global data-flow analysis (reaching definitions, live variables, partial redundancy elimination, constant propagation, etc.), loop unrolling, and so on.
I'd tend to disagree: I think fundamental language design is very important. Optimizations after the language tree has been built are an entirely different concept. Important nonetheless, but different to perhaps what the author is trying to achieve.
Personally, I think he is going about teaching it in a non-trivial manner making such things as you mentioned above more complex than they perhaps need to be. But, perhaps that's just how I've been taught how to write compilers... fundamentals often are the hardest to "un-learn".
It seems to me that there are a lot of efforts around making the front-end easier to understand. I think there needs to be at least one project that touches upon the back-end in a way that doesn't trivialize it.
There is not even one similar project for the back-end that I am aware of. And it's a shame, because I think the back-end is way cooler than the front-end.
Might I offer a suggestion? I would argue that most of the work that goes into a compiler is not the front-end functionality but rather the "middle-" and back-end functionality, i.e. making the generated code fast. It would be very insightful to those outside the compilers community as to what it's actually like to work on one to go over the basic optimizations, such as global data-flow analysis (reaching definitions, live variables, partial redundancy elimination, constant propagation, etc.), loop unrolling, and so on.