The practice of compiler construction changes continually, in part because the designs of
processors and systems change. For example, when we began to write Engineering a Compiler
(eac) in 1998, some of our colleagues questioned the wisdom of including a chapter on
instruction scheduling because out-of-order execution threatened to make scheduling largely
irrelevant. Today, as the second edition goes to press, the rise of multicore processors and the
push for more cores has made in-order execution pipelines attractive again because their smaller
footprints allow the designer to place more cores on a chip. Instruction scheduling will remain
important for the near-term future.
At the same time, the compiler construction community continues to develop new insights and
algorithms, and to rediscover older techniques that were effective but largely forgotten. Recent
research has created excitement surrounding the use of chordal graphs in register allocation
(see Section 13.5.2). That work promises to simplify some aspects of graph-coloring allocators.
Brzozowski’s algorithm is a dfa minimization technique that dates to the early 1960s but has
not been taught in compiler courses for decades (see Section 2.6.2). It provides an easy path
from an implementation of the subset construction to one that minimizes dfas. A modern course
in compiler construction might include both of these ideas.
How, then, are we to structure a curriculum in compiler construction so that it prepares students
to enter this ever changing field? We believe that the course should provide each student with
the set of base skills that they will need to build new compiler components and to modify
existing ones. Students need to understand both sweeping concepts, such as the collaboration
between the compiler, linker, loader, and operating system embodied in a linkage convention,
and minute detail, such as how the compiler writer might reduce the aggregate code space used
by the register-save code at each procedure call.