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
Aug 21
Aug 23

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.


Aug 30

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


Aug 29

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.


Sep 4
Sep 6

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.


Sep 11
Sep 13

Discussion of Hw1 solutions.
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.


  • Hw1 solutions (available on Piazza)
  • Lecture code 5
  • Sections 2.1–2.3 of Sestoft.

All ex. in code 5  
Sep 18
Sep 20

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. Examples. Producing byte code.


  • Lecture code 6
  • Chap. 2 of Sestoft

All ex. in code 6  
Sep 25

No class.

Sep 27

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

Lecture notes by Wayne Goddard on

  1. Finite Automata
  2. Regular Expressions

Practice problems in today's readings  
Oct 2

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

Lecture notes by Wayne Goddard on

  1. Nondeterministic Finite Automata
  2. Context-Free Grammars
Recommended readings:
Lecture notes by Wayne Goddard on
Practice problems in today's readings  
Oct 4

More on context-free grammars and languages. 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.

Lecture notes on

  1. Context-Free Grammars (by Wayne Goddard)
  2. Derivation Trees (by Wayne Goddard)
Recommended readings:
Lecture notes on

Practice problems in today's readings  
Oct 9

Midterm I  

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.


  1. Sect. 3.2-3.6 of Sestoft
  2. Expr code (see README files in zip archive)
  3. FSLex and FXYacc documentation
Recommended readings:
  • Sect. 3.8-3.9 of Sestoft

Oct 16
Oct 18

More on automatically generated parsers. Example of pushdown automaton parser generated by fsyacc.
Micro-ML, a simple language of recursive functions: concrete and abstract syntax. Lexer and parser specification.

Brief discussion of Midterm I solutions and grades.

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.


  1. Sect. 4.1-4.7 of Sestoft
  2. Fun code (see README files in zip archive)
  3. Midterm sample solutions (on Piazza)
Recommended readings:

Oct 23

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


  1. Sect. 4.8-4.11 of Sestoft
  2. Micro-ML class notes
  3. TypedFun code

Oct 25

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


  1. Sect. 5.1-5.5 of Sestoft
  2. Functions as First-Class Values
  3. Lecture code 7

Oct 30

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.

Records in F#. Mutable and immutable fields. Mutable variables. While loops.


  1. Sect. 5.1-5.5 of Sestoft
  2. HighFun code (see README files in zip archive)
  3. Lecture code 8
Recommended readings:

Nov 1

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

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


  1. F# : Option Types
  2. Lecture code 9
  3. Sect. 7.1-7.2 of Sestoft
Recommended readings:

Nov 6
Nov 8

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.
Parameter passing mechanisms in various programming languages.


  1. Chap. 7 of Sestoft
  2. Lecture notes on micro-C (revised)
  3. MicroC code (see README files in zip archive)
Recommended readings:

Nov 13 Nov 15

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


  1. Sect. 8.1-8.8 of Sestoft
  2. Lecture notes on micro-C compilation
  3. MicroC code (see README files in zip archive)
Recommended readings:

Exercises in lecture notes
Nov 20 Nov 22

Thanksgiving break

Nov 27

Midterm II

Nov 29

More on micro-C compilation. Examples of compilation. Compilation to real machine code.
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. Brief comparison with CLI (.NET) virtual machine. Byte code verification. Just-in-time compilation.


  1. Chap 8 of Sestoft
  2. Chap 9 of Sestoft

Dec 4

Review of stack and heap allocation. Garbage collection. The free list. Garbage collection techniques. Reference counting. Mark-sweep collection. Two-space stop-and-copy collection. Generational GC. Conservative GC. Garbage collectors in various languages.


  1. Chap 10 of Sestoft

Dec 6

Project Q&A session.


Copyright: Cesare Tinelli, The University of Iowa, 2018