I second "Modern Compiler Design" by Dick Grune. Without being bound to any language in particular, it gives you all the juicy details about how lex,yacc, LL(1) parses, recursive descent parsers etc really work really work, various backend/code ge techniques, (threading, BURS etc) and also how compilation worlks for various programming paradigms (functional, logic, imperative). This is the most "dense" beginner's book I've found. And it is very engagingly written too.
Once you've worked through this you are in good shape for more advanced books like Muchnick's.
http://www.wiley.co.uk/wileychi/grune/
There is also a great book by the same author on parsing.
http://www.cs.vu.nl/~dick/PTAPG.html