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.

Schedule

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 and Functions
  • A2 due
  • A3 out
Tue 28 Sep 9 Products
Thu 30 Sep 10 Sums and Recursive Expressions
  • A3 due
  • A4 out
Tue 5 Oct 11 Recursive Types
Thu 7 Oct 12 Parametric Polymorphism
  • A4 due
  • A5 out
Tue 12 Oct 13 Type-Level Functions and Modules
Thu 14 Oct 14 Constructive Logic (Proofs are Programs)
  • A5 due
Optional: Propositions as Types by Philip Wadler
Tue 19 Oct - No class (Fall Study Break)
Thu 21 Oct - Midterm (during lecture slot)
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)

People

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

Instructor

comar@umich.edu

Photo of Andrew Blinn
Andrew Blinn

GSI

blinnand@umich.edu

Photo of Chenyan Zhang
Chenyan Zhang

IA

zchenyan@umich.edu

Photo of Raef Maroof
Raef Maroof

IA

maroofr@umich.edu

Photo of Alan Zhang
Alan Zhang

Grader

alzhang@umich.edu

Photo of Yanjun Chen
Yanjun Chen

Grader

yanjunc@umich.edu