ECS 240, Winter 2017

Formal Semantics of Programming Languages

  • 01/10/2017: welcome to ECS 240!

Time TuTh 4:40-6:00 PM
Location 118 Olson
Instructor Zhendong Su, 3011 Kemper Hall, OH: Th 1-2 PM
TA Nima Johari (johari AT ucdavis DOT edu), OH: Tu 11-12:30 PM (3106 Kemper), W 11-noon (3106 Kemper), F 1-2:30 PM (53 Kemper)

Course Description

The goal of this course is to introduce students to fundamental ideas behind the design and analysis of modern programming languages. In the first part, we focus on the study of different approaches for specifying the semantics of programming languages. We will study operational semantics for specifying how programs compute and axiomatic semantics for verifying programs. We will apply these techniques to imperative, functional and object-oriented languages. A good reference for this part of the course is Glynn Winskel's book on The Formal Semantics of Programming Languages.

In the second part, we focus on the basic techniques used in the study of type systems for programming languages. We will start with the simply typed lambda calculus and then move on to more advanced features such as types for imperative features and exceptions, parametric polymorphism, existential types for use in abstraction and module systems, and dependent types. Good references for this part of the course are Benjamin Pierce's Types and Programming Languages (more accessible) and John Mitchell's Foundations for Programming Languages.

We will also cover additional special topics drawn from recent research in abstract interpretation, program analysis and verification, and novel applications of ideas from language semantics to system reliability and security. In addition to the topics covered in the lectures, students will have the opportunity to consider other related topics of interest in the form of a course project, most often in the form of a survey of recent research on a topic of interest.


The prerequisites for this course are programming and mathematical experience. The ideal programming experience is practical exposure to several different programming languages, such as C, ML, Prolog and Java (eg, ECS 140A). The ideal mathematical experience is knowledge of mathematical logic and ability to construct rigorous proofs (in particular by structural induction). None of these prerequisites are strictly necessary, and your desire to be exposed to this material is very important.


The lectures will be supplemented with selected classical and recent research papers. We do not have any required textbook for the course. The following books are useful references:
  • Glynn Winskel, The Formal Semantics of Programming Languages: An Introduction, MIT Pres, 1993.
  • John C. Mitchell, Foundations for Programming Languages, MIT Press, 1996.
  • Benjamin Pierce, Types and Programming Languages, MIT Press, 2002.

Useful: Programming language theory texts online.

Homework Assignments

There will be three to four homework assignments, mostly mathematical in nature.


There will be a take-home final toward the end of the quarter (most likely during the last week of classes) to evaluate each student's understanding of the course material. More details to be announced later in the course.


A major component of this course is a class project. All students are expected to select and complete a course project (more information later). Ideally, the project is original research related in a broad sense to programming semantics or logic. I will suggest some potential topics later in the course.

You must select a project and write a one or two pages proposal describing why what you propose to do is interesting and giving a work schedule. You will also write a final report describing your project and prepare a 15-20 minute presentation at the end of the course. The due dates for the project proposal, final report, and project presentation will be announced later.

Grading (tentative)

  1. research project (~40%)
  2. homework (~30%)
  3. take-home final (~20%)
  4. class participation (~10%)

Valid HTML 4.01!