Structure and Interpretation of Computer Programs, by Harold Abelson, Gerald Jay Sussman, and Julie Sussman. MIT Press 1996. An excellent introduction to computer science using the Scheme language. The Scheme-to-JVM compiler in this book is based on the Scheme compiler in Structure and Interpretation.
Compilers: Principles, Techniques, and Tools, by Alfred V. Aho, Ravi Sethi and Jeffrey D. Ullman. Addison-Wesley 1985. A textbook on how to write compilers. Goes into detail on how to write parsers and code generators, including an introduction to the theory of languages. Known affectionately as the "Dragon Book" because of the dragon on its cover.