Programming languages and systems


Programming is communication between humans about the intended behaviour of a system. The programs that we write are serve two purposes: to be understood by other human readers, and to be fed into a computer as instructions for how to behave.


There are very different requirements for these intended audiences. Whereas a computer does not care much about how its instructions are structured or what names are used to describe operations and data, human programmers do. To help the human readers (often ourselves a couple of weeks or months down the road) understand what a program does, we build abstractions that hide complexity and construct software through layers upon layers of increasing abstraction to bridge the gap between the ”1’s and 0’s” and the domain where some software is used. Thus, the act of programming is one of operationalising, and thereby understanding complex workflows, and explaining them to others and ourselves.

Different programs stress about different aspects of computation. When we write software for the bottom layers of the stack, each byte or instruction is on the critical path to performance for each layer above. This warrants focus on resource management, optimisation and efficient resource use. Higher up in the stack, we may be more concerned about the ease of maintenance, extensibility and closeness to the domain, or the time it takes from inception to deployment.

The research area of programming languages and systems is concerned with the fundamentals of software development. What should a language look like to be suitable for all of the above? How do we verify that bad things never happen (e.g. we get an invalid result) while guaranteeing that good things eventually happen (e.g. we get a result)? We study different approaches to programming: functional and declarative paradigms where programming is about explaining the meaning of operations, as well as imperative paradigms where programming is about step-by-step instructions. Specialist paradigms like constraint programming is useful for efficiently solving certain kinds of problems, etc. We also study aspects of programming in software development: how to guarantee that programs are working correctly (verification), how to infer operations from input-output examples (synthesis), how to efficiently execute programmers' instructions (compilers and runtime systems), etc.

  • Formal semantics: Mathematical modelling of programming languages, for example to prove properties about programs or programming languages
  • Model checking: Verifying the correctness of finite-state models
  • Programming language design: Design of type systems and other programming language constructs for increased programmer expressivity
  • Probabilistic programming: Statistical modelling using techniques from programming languages
  • Program synthesis: Synthesising programs from other sources than code, for example natural language descriptions or examples
  • Program verification: Ensuring that programs are correct with respect to their specification
  • Runtime systems: Efficient implementations of memory management, garbage collection and concurrency
  • Constraint programming: An AI approach to optimisation by systematic search: modelling languages, high-level constraints, high-level types for decision variables
  • Constraint-based local search: Modelling languages, search languages, solver design

  • Jonas Norlinder was named a Distinguished Artefact Reviewer at ECOOP 2022
  • Jonas Norlinder won 3rd place in the PLDI 2020 SRC with his poster based on his master thesis work
  • Distinguished Artefact at Programming Language Design and Implementation (PLDI) 2020 (Albert Mingkun Yang, Erik Österlund, and Tobias Wrigstad)
  • Distinguished Artifact at Software Language Engineering (SLE) 2019 (Elias Castegren and Kiko Fernandez)
  • Dahl-Nygaard Junior Prize 2012 to Tobias Wrigstad

  • 1DL006: Programming for Teacher Training Students
  • 1DL028: Object-Oriented Programming in Java
  • 1DT034: Programming Theory
  • 1DL042: Programming
  • 1TD062: High Performance Programming
  • 1DT096: Operating Systems and Process-Oriented Programming
  • 1DL201: Program Design and Data Structures
  • 1DL221: Imperative and Object-Oriented Programming Methodology
  • 1DL242: Advanced Software Design
  • 1DL311: Semantics of Programming Languages
  • 1DL321: Compiler Design I
  • 1TD327: Programming in Python
  • 1DL330: Functional Programming I
  • 1TD433: Computer Programming I
  • 1DL442: Combinatorial Optimisation and Constraint Programming (slides)
  • 1DL450: Advanced Functional Programming
  • 1DL451: Modelling for Combinatorial Optimisation (slides)
  • 1DL530: Introduction to Parallel Programming
  • 1DL541: Language Abstractions for Concurrent and Parallel Programming
  • 1DL550: Low-Level Parallel Programming
  • 1DL560: Parallel Programming for Efficiency
  • 1DL580: Project in Concurrent and Parallel Programming
  • 1DL601: Maintenance Programming
  • 1TD722: Computer Programming II
  • Introduction to Programming Language Research (PhD course)