Loads of practice writing code to solve problems with a significant degree of complexity where accuracy is critical and each step builds on the last. It's easily the most coding-intensive course I have ever taken.
Writing a compiler is the best way to learn the dusty corners of a language, and you typically have to learn at least two languages; the source and the target.
You learn how to read and apply BNF Grammars, not just understand what they are (as in a Theory of Comp course). You learn how they're used to specify things like operator precedence. You also will probably get a lot of practice analyzing or manipulating the resulting abstract syntax tree. If you are slow at recursion now, you won't be after trying to build a compiler (or else it will take you forever).
You make practical use of a variety of classical data structures and algorithms. You walk around your parse tree, you do graph coloring to optimize register usage.
Really though, it's not a topic you can just browse over and get much out of. The real value is actually buckling down and trying to build a compiler.
( have no desire to make a compiler, but wondering if this is a topic I should pick up )