A comprehensive programming language course, with emphasis on programming paradigms and language processors - and some of their formal models like Predicate Logic and Lambda Calculus. Hands-on work with implementations of key concepts (recursion, inheritance, unification, backtracking, type inference, infinite and lazy data objects, threads. The course also provides a glimpse at salient features of modern object oriented languages and an overview of language implementation techniques, run-time systems and memory management in an efficient procedural language.

- From Turing machines and Lambda calculus to today's programming languages
- Programming Paradigms: logic, functional, object oriented, imperative
- Language Processors: Interpreters and Virtual Machines, Compilers
- Domain Specific (DSLs) and Scripting Languages

- Intro to Untyped Functional Programming with Python
- Intro to Types and Functional Programming with Haskell
- Programming with Recursive Functions and Lists
- Higher Order Functions
- Working with Fold, Map, Zip
- Polymorphism, Type inference
- Recursive Data Types and Pattern Matching in Haskell
- List Comprehensions
- Lazy Evaluation, Computing with Infinite Lists
- Lambda Calculus, De Bruijn Indices
- Simply-typed Lambda Terms, Type Checking vs. Inference
- Evaluation of Lambda Terms, Normalization

- Intro to Prolog: Facts and Rules, Recursion, Lists and Compound Terms, Arithmetic
- Propositional and Predicate logic
- Unification and Horn Clause Resolution in Prolog
- Non-determinism and Backtracking
- Case study: solving cryptarithmetic puzzles
- Definite Clause Grammars, Parsing and Generation
- Problem solving with Prolog
- Runtime Code Generation: the dynamic database
- Higher order Predicates and Meta-interpreters
- Generating Lambda Terms in Prolog
- Type inference for simply-typed Lambda Terms in Prolog

- Classes and Objects in Python 3
- Finite functions: dictionaries and arrays
- Coroutining with
*yield* - Overview of Java 9
- Static vs. Dynamic Aspects
- Classes, Instances, Objects, Interfaces, Mix-ins
- Collections, Streams, Lambdas, Iterators and IO operations
- Reflection and Serialization

- Basics: assignment, function calls,, lexical scoping, memory representations, stack and heap
- Implementing dynamic memory management and garbage collection
- Implementing high-level programming languages in C

- Event driven programming, Coroutining, Futures, Multi-threading
- Distributed Programming, Message Passing, Coordination

- Tucker & Noonan: Programming Languages, Principles and Paradigms, McGraw Hill
- The Art of Prolog by Sterling and Shapiro, MIT Press
- Doets & van Eijck: The Haskell Road to Logic, Math and Programming
- Harper’s draft PL book
- Java for Students: Douglas Bell & Mike Parr, Prentice Hall

- 2 Individual Exams: 30%+30%
- Individual Assignments: 40%

- Python 3 tutorial
- Java generics slides
- SWI Prolog
- A good prolog tutorial.
- Haskell compiler GHC
- Haskell tutorials. On Haskell Functors and Monads this and this. On IO and imperative constructs.
- Java interpreter/compiler JDK
### Outcomes:

- Understand foundational concepts of programming languages, with emphasis on types, programming paradigms and language processors.
- Have a practical understanding of commonalities and differences between major programming paradigms.
- Understand the key object oriented, logic and functional programming concepts.
- Understand the key concepts of event driven and concurrent programming.
- Understand the use and implementation of modern programming language concepts like recursion, inheritance, reflection, unification, backtracking, type inference, infinite data objects, and threads. 6