In the time since the 1986 edition of this book, the world of compiler design
has changed significantly. Programming languages have evolved to present new
compilation problems. Computer architectures offer a variety of resources of
which the compiler designer must take advantage. Perhaps most interestingly,
the venerable technology of code optimization has found use outside compilers.
It is now used in tools that find bugs in software, and most importantly, find
security holes in existing code. And much of the "front-end" technology —
grammars, regular expressions, parsers, and syntax-directed translators — are
still in wide use.
Thus, our philosophy from previous versions of the book has not changed.
We recognize that few readers will build, or even maintain, a compiler for a
major programming language. Yet the models, theory, and algorithms associ
ated with a compiler can be applied to a wide range of problems in software
design and software development. We therefore emphasize problems that are
most commonly encountered in designing a language processor, regardless of
the source language or target machine.