Let's Build a Compiler (1988)
xmonader.github.io
xmonader.github.io
But it's worth noting that the code as published is an interpreter, not a compiler:
I find it more readable. YMMV.
I actually like that the code is in turbo pascal and that it targets M68k assembly, because that way the modern reader is encouraged to pick their own implementation language and target ISA, and you have to make sure you understand the code snippets well enough to translate the logic into your chosen language instead of just copying.
It is a DSL (a simple config language for building web apps) so not that complicated as a Turing-complete language, but still a lot of concepts remain.
As a good starting resources for building your own compiler I'd also recommend Crafting Interpreters, super nicely explained and fun to go through: https://craftinginterpreters.com/
That was a long semester.
The second time I took it, things were relaxed a bit— the curriculum was designed around working in a high-level language (Java) and we got to write an interpreter for a nice intermediate form based on a simple VM instead of compiling all the way down to machine code.
So there were definitely some differences and they did make things easier! But I still remember this as one of my favorite classes, and I'd love to take it again and go 'all the way'.
Why do you say it was a 'long semester'?