The course covers the theory of programming
languages with empahsis on mathematical
methods for specification of programming
languages and analysis of their properties. The
following topics are covered:

concrete and abstract syntax, lexical
analysis and parsing as translation of
concrete syntax to abstract syntax 
inductive definitions, definitions given in
terms of judgements and rules of
inference 
proofs by structural induction on
abstract syntax and on the structure of a
derivation 
inductive datatypes as an example of
use of structural definitions and
structural induction 
operational semantics as an inductively
specified relation, smallstep and big
step semantics 
functional programming languages:
recursive definitions, eager and lazy
languages, static analysis, type checking,
safety as a consequence of progress and
termination lemmas, significance of
safety in practice 
polymorphism, parametric
polymorphism and HindleyMilner type
inference 
imperative programming languages,
specification and proofs of correctness 
denotational semantics: domains and
continuous maps, existence of fixed
points, denotational semantics of a
functional language, interpretation of
recursion as fixed points 
optional topics: objectoriented
programming languages, parallel
computing, logic programming