Course summary

CS 242 explores models of computation, both old, like functional programming with the lambda calculus (circa 1930), and new, like memory-safe systems programming with Rust (circa 2010). The study of programming languages is equal parts systems and theory, looking at how a rigorous understanding of the syntax, structure, and semantics of computation enables formal reasoning about the behavior and properties of complex real-world systems. In light of today’s Cambrian explosion of new programming languages, this course also seeks to provide a conceptual clarity on how to compare and contrast the multitude of programming languages, models, and paradigms in the modern programming landscape. See the schedule below for full topic list. Prerequisites: 103, 110.

Course info


Will Crichton

Course assistants




Topics Readings (optional)
Week 1: September 24
Lecture 1.1 (Mon): Introduction

A Brief, Incomplete, and Mostly Wrong History of Programming Languages

Lecture 1.2 (Wed): Abstraction
Week 2: October 1
Lecture 2.1 (Mon): Computability
Lecture 2.2 (Wed): Types
Week 3: October 8
Lecture 3.1 (Mon): Data
Lecture 3.2 (Wed): Recursion
Week 4: October 15
Lecture 4.1 (Mon): Generics
Lecture 4.2 (Wed): Modules
Week 5: October 22
Lecture 5.1 (Mon): Translation
Lecture 5.2 (Wed): Memory
Week 6: October 29
Lecture 6.1 (Mon): Concurrency
Lecture 6.2 (Wed): Parallelism
Week 7: November 5
Lecture 7.1 (Mon): Traits
Lecture 7.2 (Wed): Metaprogramming
Week 8: November 12
Lecture 8.1 (Mon): Dynamism
Lecture 8.2 (Wed): Objects
Week 9: November 19
No class for Thanksgiving!
Week 10: November 26
Lecture 10.1 (Mon): Control flow
Lecture 10.2 (Wed): Interoperability
Week 11: December 3
Lecture 11.1 (Mon): Guest lecture (TBD)
Lecture 11.2 (Wed): Guest lecture (TBD)
Week 12: December 10
Final details TBD