About 15-814
This course introduces the fundamental principles of programming language design, type systems, and semantics.
Core Topics
- Static and dynamic semantics
- Preservation and progress
- Hypothetical judgments
- Substitution
- Propositions as types
- The untyped lambda-calculus
- Functions, products, sums
- Recursive types
- Parametric polymorphism, data abstraction, existential types
- Substructural type systems
- Type systems for controlling complexity
- Shared-memory concurrency, session types
Learning objectives
After taking this course, students will be able to
- define programming languages via their type system and operational semantics
- draw from a rich set of type constructors to capture essential properties of computational phenomena
- state and prove the preservation and progress theorems or exhibit counterexamples
- recognize and avoid common fallacies in proofs and language design
- write small programs to illustrate the expressive power and limitations of a variety of type constructors
- state and prove properties of individual programs based on their semantics or exhibit counterexamples
- critique programming languages and language constructs based on the mathematical properties they may or may not satisfy
- appreciate the deep philosophical and mathematical underpinnings of programming language design
It is not a goal of this course to provide a survey of popular languages, as doing so has no enduring educational value, and would only reinforce oft-repeated mistakes in language design.
Prerequisites
This is an introductory graduate course with no formal prerequisites. Exposure to (statically-typed) functional programming languages such as SML, OCaml, or Haskell and proofs by rule or structural induction is helpful.
Undergraduate and masters students are welcome to attend this course. If you have already taken 15-312 Principles of Programming Languages, please check with the instructor if this course is suitable for you.
Staff
Instructor: Jan Hoffmann
Teaching Assistant: C.B. Aberlé