CAS CS 320: Concepts of Programming Languages (UNDER CONSTRUCTION)

CAS CS 320 is a course about programming languages, particularly the design and implementation of programming languages. In this course, we take up the programming language as an object of formal study. This course is not about how to program, though the principles we cover are generally useful for writing and reasoning about programs.

The first part of the course is on functional programming in OCaml, based on CS 3110: Data Structures and Functional Programming at Cornell University and its associated textbook (referred to as OCP below). Its topics include algebraic data types, higher-order functions, and polymorphism. It's during this part that we learn to think functionally, to view programs not as sequences of commands manipulating global state, but as compositions of functions which deconstruct and reorient data.

In the second part of the course we implement several interpreters for various fragments of OCaml; that is, we will write OCaml programs which execute OCaml programs. The topics covered include parsing, operational semantics, variable scope and binding, type checking and type inference. By the end of the course, you'll be able to execute some of the simpler programs we wrote in the first part of the course using your own interpreter.

Schedule

The following table contains a complete schedule for the semester. You can click on any of the topics, to see the corresponding reading, any assignment to see the assignment, and any lab to see the lab.

Date

Topic

Reading

Assignments

9/2

Course Introduction

OCP (1.1, 1.2, 1.3, 2.1, 2.2, 2.3)

Assignment 0

9/3

Lab 1: Installation Party

9/4

Beginning Ocaml I: The Basics

OCP (2.2, 2.4, 2.6, 2.7)

Assignment 1

9/9

Beginning Ocaml II: Unions and Products

OCP (3.2, 3.4, 3.9)

9/10

Lab 2: Thinking Recursively

9/11

Beginning OCaml III: Lists, Tail Recursion

OCP (3.1, 3.5, 3.7, 3.8)

Assignment 2 (A1 due)

9/16

Algebraic Data Types I: The Basics

OCP (3.6, 3.9, 3.11, 8.3)

9/17

Lab 3: TSV Reader

9/18

Algebraic Data Types II: Polymorphism

Assignment 3 (A2 due)

9/23

Higher Order Programming I: Maps and Filters

OCP (4.1, 4.2, 4.3, 4.7)

9/24

Lab 4: S-Expressions

9/25

Higher Order Programming II: Folds

OCP (4.4, 4.5)

Assignment 4 (A3 due)

9/30

Intermediate OCaml I: Error Handling, Testing

OCP (3.3, 3.10)

10/1

Lab 5: When2meet

10/2

Intermediate OCaml II: Modules

OCP (5.1, 5.2, 5.3, 5.4, 5.5)

Assignment 5 (A4 due)

10/7

Parsing I: Formal Grammar

PL@BU (1, 2)

10/8

Lab 6: Formal Grammar Worksheet

10/9

Parsing II: Lexing, Parsing Ambiguity

PL@BU 2

Practice Midterm (A5 due)

10/14

No Lecture (Substitute Monday)

10/15

Lab 7: Midterm Review

10/16

Midterm

Assignment 6

10/21

Parsing III: Lexer/Parser Generators

OCP 9.2, PL@BU 3

10/22

Lab 8: S-Expressions Again

10/23

Formal Semantics I: Operational Semantics

OCP 9.1

Mini-Project 1 (A6 due)

10/28

Formal Semantics II: The Substitution Model

OCP 9.3

10/29

Lab 9: Operational Semantics Worksheet

10/30

Formal Semantics III: Variables, Scope, Closures

OCP 9.4

(MP1 check-in due)

11/4

Formal Semantics IV: The Environment Model

OCP 9.4

11/5

Lab 10: An Imperative Language

11/6

Type Checking I: The Simply-Typed Lambda Calculus

OCP 9.5

Mini-Project 2 (MP1 due)

11/11

Type Checking II: Progress and Preservation

OCP 9.5

11/12

Lab 11: Closures Worksheet

11/13

Type Checking III: Polymorphism

OCP 9.5

(MP2 check-in due)

11/18

Type Inference I: Hindley-Milner (Light)

OCP 9.6

11/19

Lab 12: Polymorphism Worksheet

11/20

Type Inference II: Unification

OCP 9.6

Mini-Project 3 (MP2 due)

11/25

Type Inference III: Constraint-Based Inference

OCP 9.6

11/26

No Lab (Thanksgiving Recess)

11/27

No Lecture (Thanksgiving Recess)

12/2

Type Inference IV: Extended Example

OCP 9.6

12/3

Lab 14: Type Inference Worksheet

12/4

Compilation I: Stack-Based Languages

(MP3 check-in due)

12/9

Compilation II: Byte-Code Interpretion

12/10

Lab 15: Final Exam Review

(MP3 due)

TBD

Final Exam