Programming Languages and Systems Research

How can we make software implementations more safe and reliable? We address this issue on four different levels:

Semantics. We could design better programming languages and better tools to assist programming if only we understood what a piece of code precisely means. Programming language semantics is the endeavour that assigns meanings to programs. Some of the more fundamental work conducted in this group are attempts to further our general knowledge of programming language concepts. (Varmo Vene, Härmel Nestra)

Static Analysis. If we have a precise understanding of what a piece of code really means, we can simply analyse this code and guarantee that it is safe without having to execute it. This is particularly useful for heisenbugs, such as data races, that are hard to detect by conventional approaches to quality assurance. (Vesal Vojdani, Kalmer Apinis, Varmo Vene)

Runtime monitoring. Flaws in a system can be cumulative. Consider, for example, memory bloat and memory leaks in Java. These are problems that occur when references to unused objects are kept somewhere. Dynamic analysis and runtime monitoring are better suited for this class of problems, but they often come with significant overhead. Finding light-weight methods for profiling is necessary for practical applications. (Nikita Salnikov-Tarnovski, Vesal Vojdani)

Deployment. We can contribute significantly to code quality by facilitating the deployment of code fixes. If a code update in a compiled language, such as Java, can be immediately tested without having to redeploy and restore the state of the system, developers will be much more effective in improving their code. Further, if we can allow updates to live systems, customers will more quickly benefit from code fixes. (Jevgeni Kabanov, Varmo Vene)