This page gives highlights of past lectures and provides lecture notes, reading assignments, and exercises.

Chapters, sections and exercises in readings are from the textbook, unless specified otherwise.

Readings on F# link directly to online resources, such as examples or the Wikibook on F# Programming.


Dates Topics Exercises
Jan 14
Jan 16
Jan 18

Course introduction and administration. Overview of course topics. Programming language paradigms. Brief history of programming languages. Compilation vs. interpretation. Issues and factors in programming language design.

An introduction to F#. Basic types and operators. Basic expressions and type checking. Tuple types.

Readings:

Jan 23
Jan 25

Variable binding. Variable scope ands scoping rules. Function definitions. Pattern matching. Patterns in let expressions and in function definitions.

The match construct. Meaning and common uses. Scoping of pattern variables in match. Use of match in function definitions.
Algebraic datatypes (ADT), or discriminated unions, in F#. Basic uses. Pattern matching with ADTs. Functions accessing and manipulating ADTs.

Readings:

Jan 28
Jan 30
Feb 01

Using ADTs to encode arithmetic expressions. Simple evaluators of arithmetic expressions.

Parametric types in F#. Motivation and uses. Parametric algebraic datatypes. F# Lists. Basic features and examples. Using pattern matching and recursion to implement functions over lists.

Evaluating arithmetic expressions with variables.

Readings:

Feb 04
Feb 06
Feb 08

Extending the basic expression language with variables and with let binders. Evaluating expressions with let binders. Examples.

Implementing finite sets in F# using lists. Free and bound variables, variable scope.

Compiling expressions with variable names to expressions with variable indices.

Readings:

  • Lecture code 6
  • Lecture code 7
  • Sections 2.1–2.3 of Sestoft.
  • Section 2.4 of Sestoft.
All ex. in code 6
Feb 11
Feb 13
Feb 15

Stack machines for expression evaluation, with variables and without. Compiling expressions to stack machine code. Running stack machine code. Examples. Producing byte code.

Readings:

  • Lecture code 8
  • Chap. 2 of Sestoft.
All ex. in code 8
Feb 18
Feb 20
Feb 22

Formal languages. Regular expressions. Languages generated by regular expressions. Finite Automata. Finite automata as recognizers of regular languages. Examples.

Non-deterministic finite-state automata (NFAs). Definition and examples. Relationships between NFAs, deterministic automata and regular expressions.

Applications to programming languages.

Readings:
Lecture notes by Wayne Goddard on

Recommended readings:
Lecture notes by Wayne Goddard on
Practice problems in this week's readings
Feb 25
Feb 27
Mar 01

Context-free grammars and languages. Definition and examples. Systematically generating CFG's from regular expressions.

Derivations and derivation trees. Ambiguous grammars. Examples and exercises.

Pushdown automata. Recognizing context-free languages with pushdown automata. Examples.

Readings:
Lecture notes by Wayne Goddard on

Recommended readings:
Lecture notes on
Practice problems in this week's readings
Mar 04

Midterm 1

Mar 08
Mar 11

From concrete to abstract syntax. Lexers, parsers and generators. Specifying lexers and parsers in F# with fslex and fsyacc.

A concrete syntax and a lexer and parser for a simple language of expressions.

Example of pushdown automaton parser generated by fsyacc.

Readings:
  • Sect. 3.2-3.6 of Sestoft
  • expr code (see README files in zip archive)
  • FSLex and FSYacc documentation
Recommended readings:
  • Sect. 3.8-3.9 of Sestoft
Mar 13
Mar 15
Mar 25

Micro-ML, a simple language of recursive functions: concrete and abstract syntax. Lexer and parser specification.

Examples of micro-ML programs. Interpreting micro-ML. Specifying interpreters formally with evaluation rules. Implementation of specification in F#, via eval function. Static and dynamic scope.

Readings:
  • Sect. 4.1-4.7 of Sestoft
  • fun code (see README files in zip archive)
Recommended readings:
Mar 27

Static vs. dynamic typing. Adding type-checking to micro-ML. Formal type-checking rules. Implementation of type checker.

Readings:

Mar 29
Apr 01
Apr 03

Higher-order functions in F#. Currying and partial evaluation. Higher-order combinators. Examples.

Extending Micro-ML to higher-order functions. Comparison between interpreters for first-order and higher-order micro-ML. Examples of higher-order programming in Micro-ML.

Eager and Lazy evaluation. Call by value, call by name. Advantages and disadvantages.

Readings:
Apr 05

Imperative programming. Main concepts. Programs as state transformers. A naive imperative language. Environment and store.

Readings:
Recommended readings:
Apr 08
Apr 10
Apr 12

The C programming language. Integers, pointers and arrays in C. Type declarations in C. The micro-C language. Interpreting micro-C programs. Local and global environments. Memory model. Store and activation records. Interpreting statements, declarations, expressions, and variable access in the presence of side effects. Relationship between & (address) and * (pointer dereferencing) operators.

Readings:
Recommended readings:
Apr 15
Apr 17
Apr 19
Apr 22
Apr 24

A virtual stack machine for micro-C. Instruction set, concrete and symbolic. Virtual machine as implemented in Java and C. The structure of the runtime stack. Compiling micro-C to machine code: overview of main approach.

Readings:
  • Sect. 8.1-8.8 of Sestoft
  • microc code with virtual stack machines (in C and in Java) and usage examples.
  • Lecture notes on micro-C compilation
Exercises in lecture notes
Apr 26

Brief overview of basic concepts in object-oriented languages. Memory model for object-oriented languages. Stack and heap allocation.

Real-world virtual machines. An overview of the Java virtual machine.

Readings:
Apr 29
May 01
May 03

Project Q&A sessions.