This course covers the design and implementation of compiler and runtime systems for high-level languages, and examines the interaction between language design, compiler design, and runtime organization. Topics covered include lexical and syntactic analysis, semantic analysis, type-checking, program analysis, code generation and optimization, memory management, and runtime organization.

Compilers and principles of compiling are one fundamental core aspect of computer science.
Compilers and several other parts of compiler technology (especially parsing, transformation, analysis, and optimization) play important roles in many systems built every day.
The knowledge gained in this course should be broad enough that if you are confronted with the task of contributing to the implementation of a real compiler in the field or similar technology, you should be able to do so confidently and quickly.

Grading will be based on a set of homework assignments (30%) and labs (70%).
There are 6 labs worth a total of 700 points.
Labs can be done individually or in pairs.
There are 5 written assignments worth a total of 300 points.
Written assignments must be done individually.
There will be no midterm or final exams.