Revised July 13, 2015

CS 444: Compiler Construction


Watch a video introduction to this course on YouTube.

General description

This course covers the basic structure of compilers for Algol-like languages. A major part of the course involves implementing a compiler for a simplified Algol-like language. Students discover software tools and techniques that are applicable to both compilers and the implementation of system utility routines, command interpreters, etc.

Logistics

Audience

  • Fourth year CS majors interested in the design and implementation of programming languages. Students who do a substantial amount of programming should find the material valuable.

Normally available

  • Winter

Related courses

  • Pre-requisites: CS 350 or SE 350; Computer Science students only.

For official details, see the UW calendar.

Software/hardware used

  • Students can use any programming language and development tools to complete the course project.

Typical reference(s)

  • Fischer, Cytron, and LeBlanc, Crafting a Compiler, Addison Wesley

Required preparation

At the start of the course, students should be able to

  • Write, debug, and test moderately-sized programs
  • Read and write technical documents

Learning objectives

At the end of the course, students should be able to

  • Read, interpret, and implement the specification of a mainstream programming language
  • Write, debug, and test a compiler that translates from a mainstream programming language to assembly language
  • Document the technical decisions and tradeoffs in the design and implementation of their compiler
  • Implement algorithms for parsing and parser generation
  • Explain the role of types and of type soundness in the design of a programming language

Much of the course mark is based on a project that is done in teams of 3 or 4 students.

Typical syllabus

Introduction (1 hour)

  • Overview of language translation
  • Compiler-compilers and translator writing systems
  • Notions of lexical analysis, parsing, and one-pass vs. multi-pass compilation

Course project (1 hour)

  • Discussion of a general-purpose procedural, algorithmic programming language (derivative of Ada) that students taking the course write a compiler for
  • Organizing group projects
  • Documentation
  • Programming style

Parsing and lexical analysis (3 hours)

  • Introduction to automatic tools for lexical and syntactic analysis
  • Discussion of underlying theory

Scope rules, block structure and symbol table organization (6 hours)

  • Organization of a symbol table to reflect scoping rules provided by various language constructs
  • Discussion of time/space trade-offs

Semantic processing (6 hours)

  • Semantic analysis - checking that the program makes "sense"
  • Declarations
  • Type checking
  • Overload resolution

Storage and organization (8 hours)

  • Runtime stack
  • Displays
  • Static and dynamic links
  • Parameter passing
  • Procedure call and return
  • Data templates
  • Strings
  • Heap storage management

Code generation (8 hours)

  • Intermediate code
  • Trees and quadruples
  • Arithmetic expressions
  • Boolean expressions
  • Code templates for various constructs
  • Introduction to code improvement and control-flow analysis
  • Table-driven code generation

Code optimization (3 hours)

  • Overview of techniques for producing "better" code