This page gives highlights of past lectures and provides lecture notes, reading assignments, and exercises.
Chapters, sections and exercises in readings are from the main textbook, unless specified otherwise.
Readings on F# link directly to online resources, such as examples or the Wikibook on F# Programming.
Dates  Topics  Exercises 

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


Aug 30 
An introduction to F#.
Basic types and operators.
Basic expressions and type checking.
Variable binding. Variable scope ands scoping rules.
Function definitions.
Tuple types.


Sep 1 
More on F#.
Pattern matching.
Patterns in let expressions and in function definitions.
The match construct. Meaning and common uses.
Scoping of pattern variables in match.


Sep 6 
Algebraic datatypes (ADT), or discriminated unions, in F#.
Basic uses.
Pattern matching with ADTs.
Functions accessing and manipulating ADTs.
Using ADTs to encode arithmetic expressions.
Simple evaluators of arithmetic expressions.


Sep 8 
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.


Sep 13 
No class 

Sep 15 
Implementing finite sets in F# using lists.
Extending the basic expression language with variables
and with let binders.
Free and bound variables, variable scope.
Evaluating expressions with let binders.
Examples.

All ex. in code 5 
Sep 20 Sep 22 
Compiling expressions with variable names to expressions with variable indices.
Stack machines for expression evaluation, with variables and without.
Compiling expressions to stack machine code.
Running stack machine code.
Implementing an abstract machine in Java.
Examples.

All ex. in code 6 
Sep 27 
Formal languages.
Regular expressions. Languages generated by regular expressions.
Finite Automata.
Finite automata as recognizers of regular languages.
Lecture notes by Wayne Goddard on 
Practice problems in today's readings 
Sep 29 
Nondeterministic finitestate automata (NFAs).
Definition and examples.
Relationships between NFAs, deterministic automata and regular expressions.
Contextfree grammars and languages.
Definition and examples.

Practice problems in today's readings 
Oct 4 
Midterm I 

Oct 6 
More on contextfree grammars and languages.
Systematically generating CFG's from regular expressions.
Derivations and derivation trees.
Ambiguous grammars.
Examples and exercises.
Pushdown automata.
Recognizing contextfree languages with pushdown automata.
Examples.
Lecture notes on

Practice problems in today's readings 
Oct 11 
More on derivations and derivation trees.
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.
Lecture notes on


Oct 13 
More on automatically generated parsers.
Example of pushdown automaton parser generated by fsyacc.


Oct 18 Oct 20 
Examples of microML programs.
Interpreting microML.
Specifying interpreters formally with evaluation rules.
Implementation of specification in F#, via eval function.
Static and dynamic scope.
Adding typechecking to microML.
Formal typechecking rules.
Implementation of type checker.
Static vs. dynamic typing.


Oct 25 
Higherorder functions in F#.
Currying and partial evaluation.
Higherorder combinators.
Examples.


Oct 27 
Extending microML to higherorder functions. Comparison between interpreters for firstorder and higherorder microML. Examples of higherorder programming in MicroML
Records in F#.
Mutable and immutable fields.
Mutable variables.


Nov 1 Nov 3 
Imperative programming. Main concepts.
Programs as state transformers.
A naive imperative language.
Environment and Store.
The C programming language.
Integers, pointers and arrays in C.
Type declarations in C.
The microC language.


Nov 8 
Additional F# features.
Alternative syntax for parametric types.
Immutable maps.
Option types and their uses.
Sequencing of expressions with the ; operator.


Nov 10 
Parameter passing mechanisms in various programming languages.


Nov 15 
Midterm II 

Nov 17 
An virtual stack machine for microC.
Instruction set, concrete and symbolic.
Virtual machine as implemented in Java.
The structure of the runtime stack.
Compiling microC to machine code: overview
of main approach.

Exercises in lecture notes 
Nov 22 Nov 24 
Thanksgiving break 

Nov 29 Dec 1 
More on microC compilation.
Examples of compilation.
Compilation to real machine code.


Dec 6 
Realworld virtual machines.
An overview of the Java virtual machine.
Main differences with CLI (.NET) virtual machine.
Byte code verification.
Justintime compilation.


Dec 8 
Discussion of course project.

