CS502: Compiling and Programming Systems

Course Description

Covers the theory behind the different components of a compiler, programming
techniques to put the theory into practice, and the interfaces used to
modularize the compiler. The core requirement for the course is the construction
of a compiler for a simple but nontrivial language of the Algol family
with nested scope and heap-allocated records, supplemented by written exercises,
and exams. The project is organized to demonstrate important techniques
that are now in common use: abstract syntax trees to avoid dangling syntax
with semantics, separation of instruction selection from register allocation,
sophisticated copy propagation to allow greater flexibility to earlier
phases of the compiler, and careful containment of target-machine dependencies
to one module.

Advanced material will also be included where time allows, such as garbage
collection, compilation of object-oriented and functional languages, dataflow
analysis, loop optimizations, parser error recovery, code-generator generators,
byte-code interpreters, static single-assignment form, instruction scheduling
and software pipelining, parallelization techniques, and cache-locality
optimizations such as prefetching, blocking, instruction-cache layout,
and branch prediction. Extra credit and elective options allow students
to explore these topics concretely as extensions of the base course project.