Course Syllabus

This course introduces the fundamental principles of programming language design, semantics, and implementation. For more information on the course philosophy, read Why Study Programming Languages?.

After completing this course you will have acquired the following knowledge and skills:

  1. How to define the levels of syntax of a language: its concrete syntax as a collection of strings; its abstract syntax as a collection of ast's; its binding structure for identifiers as a collection of abt's.
  2. How to define the statics of a language by a collection of typing rules governing the composition of a program from parts.
  3. How to define the dynamics of a language by a collection of transition rules governing the execution of a program in a context.
  4. How to prove that a language is safe in that its statics and dynamics are coherent in that they validate appropriate progress and preservation theorems.
  5. How to formulate and analyze a broad range of programming language concepts within this framework so as to make them mathematically precise and subject to rigorous analysis.
  6. How to avoid pitfalls of language design such as imprecise formulation, confusing implementation with abstraction, or prioritizing subjective (methodological) considerations over objective (mathematical) properties.

It is not a goal of this course to survey or sample a range of popular languages, though it is occasionally helpful to draw on these for examples of errors in language design.

Please see the Course Overview for information about the course structure and policies.

Course Summary:

Date Details Due