EECS 490: Programming Languages

Fall 2021

Programming languages are rich mathematical structures and powerful user interfaces. This course covers the design and use of modern programming languages. We will build up systematically from mathematical first principles while considering human factors in language design, language prototyping, and techniques for reasoning about program behavior throughout the course.

The goal is to change the way you think about programming and programming language design in ways that will remain relevant across the many technology hype cycles that you will encounter over the course of your careers.

Students may also be interested in the following complementary courses:
  • EECS 398 (Programming Paradigms), which focuses more on making effective use of various language features, and less on mathematical first principles and program reasoning.
  • EECS 483 (Compiler Construction), which goes more in depth on language implementation topics like parsing and low-level optimization that are covered only minimally in this course.


Open in Google Calendar

Day # Lecture Topic Deadline Readings
Tue 31 Aug 1 Course Overview Required: Cornell CS 3110 Notes, Ch. 2
Thu 2 Sep 2 Programming with Mathematical Expressions
  • Survey 1 out
Required: Cornell CS 3110 Notes, Ch. 3 (except 3.1.3)
Tue 7 Sep 3 Recursive Datatypes and Recursion Schemes
  • A1 out
Required: Cornell CS 3110 Notes, Ch. 4
Thu 9 Sep 4 Equational and Inductive Reasoning
  • Survey 1 due
Required: Princeton COS 326 Notes on Reasoning: Basics, Lists
Tue 14 Sep 5 Syntax
Thu 16 Sep 6 Semantics
  • A1 due
  • A2 out
Tue 21 Sep 7 Types
Thu 23 Sep 8 Variables
  • A2 due (free late day)
  • A3 out (Friday night)
Tue 28 Sep 9 Functions and Recursive Expressions
Thu 30 Sep 10 Products
  • A3 due
  • A4 out (Friday night)
Tue 5 Oct 11 Sums
Thu 7 Oct 12 Recursive Types
  • A4 due
  • A5 out (Friday night)
Tue 12 Oct 13 Parametric Polymorphism
Thu 14 Oct 14 Constructive Logic (Proofs are Programs)
  • A5 due (Sat. 16 Oct)
Optional: Propositions as Types by Philip Wadler
Tue 19 Oct - No class (Fall Study Break)
Thu 21 Oct - Midterm (during lecture slot, see Piazza)
Tue 26 Oct 15 Dynamic Classification, Gradual Typing, and Typed Holes Optional: What is Gradual Typing by Jeremy Siek
Thu 28 Oct 16 Imperative Programming I - Side Effects
  • A6 out
  • Mid-Semester Survey out
Optional: TAPL Ch. 13
Tue 2 Nov 17 Imperative Programming II - Mutable Data Structures
Thu 4 Nov 18 Encapsulated Commands (e.g. Haskell's IO types), Imperative Program Verification I
  • A6 due
  • A7 out
Optional: Introduction to IO (Haskell Wiki), Optional: CMU 17-654: Hoare Logic: Proving Programs Correct
Optional: Washington CSE 331: Reasoning About Code (Hoare Logic)
Tue 9 Nov 19 Imperative Program Verification II
Thu 11 Nov 20 Ownership and Borrowing in Rust I Optional: Rust Book Ch. 4.1-4.2: Understanding Ownership
Tue 16 Nov 21 Ownership and Borrowing in Rust II
  • A7 due
  • A8 out
Thu 18 Nov 22 Parallelism and Cost Semantics I Optional: PFPL Ch. 37-38
Tue 23 Nov 23 Parallelism and Cost Semantics II
Thu 25 Apr No class - Thanksgiving Break
Tue 30 Nov 24 Concurrent Interaction
  • A8 due
  • A9 out
Optional: PFPL Ch. 39
Thu 2 Dec 25 Distributed Computation Optional: PFPL Ch. 40
Tue 7 Dec 26 Macro Systems
  • A9 due
  • End-of-semester survey out
Optional: Macros - Rust Book
Thu 9 Dec 27 Special Topics
Fri 17 Dec Final Exam (8:00-10:00am)


For technical questions, please use Piazza. For administrative questions, please email the instructional staff collectively at unless you have a specific reason for contacting a staff member individually.
Photo of Cyrus Omar


Photo of Andrew Blinn
Andrew Blinn


Photo of Chenyan Zhang
Chenyan Zhang


Photo of Raef Maroof
Raef Maroof


Photo of Alan Zhang
Alan Zhang


Photo of Yanjun Chen
Yanjun Chen