For background information on the topic as a whole, scroll to the end of this page.
Available Project Proposals
If you are interested in the general topic of Software Engineering and Programming Languages or if have your own project idea related to the topic, please contact us directly. Alternatively, you can also work on one of the following concrete project proposals:
Contact
Background
Software engineering is the most technical part of technical computer science, focused on developing and applying systematic principles common to other kinds of engineering (like mechanical or electrical engineering) to development of software systems. In particular, it covers:
- Software requirements, their elicitation, specification and verification
- Software architecture, modelling and design
- Software testing, quality and guarantees
- Software construction, methodologies and processes
- Software deployment, configuration and maintenance
- Software project management, planning and audit
- Software ethics, licensing and collaboration
Software evolution, in particular, is a branch of software engineering focused on studying existing software and not necessarily creating new one. It covers, among other topics:
- Mining repositories of versioned source code for interesting facts about software history
- Refactoring, restructuring and replatforming of software
- Developing and calculating metrics on software artefacts
- Automatically measuring quality of source code by detecting harmful constructs
- Bug fixing and other forms of corrective maintenance
- Automating and tool-supporting maintenance activities
A typical research project in software engineering involves an implementation of a software system at least up to a fully functioning prototype, performing a feasibility study and/or a user study. A typical software evolution project covers development of a software system that analyses or transforms another software system. Both often use methodologies from empirical software engineering.
There are many programming languages out there, with different features for solving different problems. Most of them can be roughly categorized in what paradigms, i.e., approaches to programming, they support. Three well-known paradigms are:
- imperative, where a program describes how to change the state of objects (e.g. variables). For example, C and Java are imperative languages, and Python supports, among others, imperative programming.
- functional, where a program is described as a (mathematical) function. Haskell is a typical example.
- declarative describes the desired result, but no direct way to compute it. An example is the SQL database query language.
Note, however, that many programming languages support more than one paradigm, or are somewhere in between. For example, Python also supports functional programming, and C++ and Java have evolved from purely imperative languages to also support functional features, like lambda abstractions. An overview of many paradigms and languages can be found in this video, which is based on Peter van Roy's overview.
In this topic, we cover questions about programming languages, including their design, features, and implementations. Typical projects in this topic
- add new features to an existing programming language
- improve an existing programming language implementation
- implement a new programming language from scratch
- compare different programming languages
Prerequisites
- Basic knowledge about programming and design of software
- Programming experience with more than one language
Related modules and courses
- Programming Paradigms (functional, concurrent and logic programming + compiler construction)
- Discrete Structures and Algorithms (automata and graph algorithms, semantics)
- Model-Driven Engineering
- Principles of Programming, Processes and Patterns
- Software Evolution