Programming Languages
The overall aim of the Programming Languages theme is to improve the effectiveness and reliability of programming languages and systems. Effectiveness such that programmers can express intent at the right level of abstraction and get actionable feedback that is relevant and timely. Reliability such that programmers can trust the execution and analysis of programs. These dual goals of effectiveness and reliability are achieved through the design and study of programming languages and tools for editing, analysing, transforming, and compiling programs written in those languages. In this theme, you will learn everything from the mathematical foundations of programming languages to the practical engineering of programming language tools, and from latest new developments in the field of programming languages to how to design your own programming language from scratch.
Year 1 |
|||
Quarter 1 |
Quarter 2 |
Quarter 3 |
Quarter 4 |
Software Architecture | Core course | Responsible Computer Science | Research course |
Core course | Theme 1 | Theme 1 | Theme 1 |
Core course | Theme 2 | Theme 2 | Theme 2 |
Credits: each course in a theme is 5EC, so each theme is 15EC.
Students choose 2 themes, each of which has 3 courses in the 2nd, 3rd and 4th quarters of the 1st year. For this theme, you will take the following courses:
Q2 - Compiler Construction
Compilers translate the source code of programs in a high-level programming language into executable (virtual) machine code. In this course you will study the architecture of compilers, and important concepts and techniques underlying the components of that architecture. You will study these techniques by applying them in practice to implement your own compiler for a small language. Topics covered include syntax and parsing, static semantics and type checking, virtual machines and assembly code, interpretation versus compilation, code generation, memory management including garbage collection, data-flow analysis, and optimization.
Q3 - Parallel and Concurrent Programming
Modern software systems increasingly rely on parallel and concurrent programming to leverage multicore architectures and network advancements for performance gains. Writing correct and efficient parallel and concurrent programs is challenging and requires understanding the behaviours of the primitives and reasoning about them. This course provides students with a deep understanding and practical experience of parallel and concurrent programming and the analysis of resulting programs. It is divided into three parts: parallelism, concurrency, and automated analysis techniques for concurrency, covering topics such as performance improvement, shared memory programming, concurrency complexities, and automated analysis approaches for detecting concurrency bugs and ensuring program correctness.
Q4 - Advanced Functional Programming
The goal of functional programming is to write software that is efficient, scalable, and robust, while maintaining a high level of abstraction. In this course, we will explore various techniques and language features designed for the application of functional programming in large-scale software projects. Specifically, we will focus on efficiency, scalability and robustness of functional programs, covering topics such as purely functional data structures, controlling lazy evaluation, persistence and amortization, monad transformers, embedded domain-specific languages, generic programming, type-level programming, generalized algebraic datatypes, refinement types, and security types.