CS442: Principles of Programming Languages will be taught mixed online and offline this term. The course outline is available here, and the schedule is available here.

Online communication will be through Piazza. Some material, in particular exams, will be published through Learn.

The primary mode of instruction will be text notes, with supplementary videos, and of course regular office hours. Lecture time will be “flipped”, and used for deeper, more detailed discussion, as well as examples and demonstrations of programming languages. There are six assignments, and instead of a conventional midterm and final exam, five smaller exams (one per assignment except for the last assignment) throughout the term. Assignment submission is through UWaterloo submit, and exams are on Learn.

Assignments are due on Fridays by NOON, NOT MIDNIGHT, with the exception of the final assignment which is due during the exam period (it is a final assessment, but has the same weight as all other assignments). Exams will become available on the following Monday, with the exception of Exam 5 (see the schedule). You have three days to take the exam, during which you may choose a three-hour window.

Graduate students taking CS642 are additionally required to do a final project. The requirements for this are quite open ended, but must be agreed upon between the instructor and the student. Some examples might be a larger interpreter, a compiler, or a paper survey of language semantics or features. Contact the instructor to decide.


CS442 is rightly named: The principles of programming languages. This course covers the ideas underpinning programming languages, by covering the formal, mathematical model behind programming languages as calculi, and then discussing many programming language paradigms, and how these paradigms affect both the formal semantics and the implementation of language interpreters, compilers, and virtual machines.

Although you will learn new programming languages in this course, and are expected as a fourth-year CS student to be able to pick up new programming languages, this course is not “a new programming language every week”. This version of the course could be described as “a new programming paradigm every two weeks”, and we will use an exemplar programming language for each paradigm, but the goal is to focus on the paradigms, not the particular languages. Work in this course will be done in OCaml and Smalltalk.

The programming paradigms this course will examine are:

The goal is not to learn each of these programming languages, but to examine the paradigm itself, its effect on formal semantics, and its effect on implementing languages.

Course Staff

Course Content

Use the menu above or links here to access course content: