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
- Dynamic types
- Substructural type systems
- Type systems for controlling complexity
Learning objectives
After taking this course, students will be able to
- define programming languages with static and dynamic semantics
- understand type constructors and their essential properties
- state and prove the preservation and progress theorems or exhibit counterexamples
- recognize and avoid common fallacies in proofs and language design
- analyze and understand the structure of a programming language
- critique programming languages and language constructs based on the mathematical properties they may or may not satisfy
- state and prove properties of individual programs based on their semantics or exhibit counterexamples
- appreciate the 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 without formal prerequisites. It is expected that students have programming experience and are comfortable with developing mathematical proofs. 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: Thomas Draper