As computing has changed, so has the role of both the compiler and the compiler writer. The proliferation of processors, environments, and constraints demands an equally large number of compilers. To adapt, compiler writers retarget code generators, add optimizations, and work on issues such as code space or power consumption.Engineering a Compiler re-balances the curriculum for an introductory course in compiler construction to reflect the issues that arise in today's practice. Authors Keith Cooper and Linda Torczon convey both the art and the science of compiler construction and show best practice algorithms for the major problems inside a compiler. Focuses on the back end of the compiler-reflecting the focus of research and development over the last decade Applies the well-developed theory behind scanning and parsing to introduce concepts that play a critical role in optimization and code generation. Introduces the student to optimization through data-flow analysis, SSA form, and a selection of scalar optimizations. Builds on this background to teach modern methods in code generation: instruction selection, scheduling, and register allocation. Presents examples in one of several different programming languages in order to best illustrate the concept Explores the design space by examining how problems have been solved and by identifying the constraints that have made each of these solutions attractive.