Exploratory Language Development

Damian Frolich

(Co-)promotors: prof. dr. ir. C.T.A.M. de Laat (UvA), dr. L.T. van Binsbergen (UvA)
University of Amsterdam
Date: 27 February 2026
Thesis: PDF will follow

Summary

Programming languages can affect the quality of software and the activity of writing the software. For example, Python is well suited for data science applications due to the immense number of data science libraries available for use in Python programs. However, Python is not suited for all applications. For instance, usage of Python in the domain of embedded system is less likely since memory and compute performance are not the main concerns in the design of the Python language. For such domains, a language closer to the hardware, such as C, is more applicable. Although Python and C are both general-purpose languages and not designed with a specific domain in mind, they do make different trade-offs in their design that make them suitable for different applications. There are also languages that are specifically designed for certain domains and using the language outside that domain is impractical. An example of such a language is TEX, which is designed for the domain of typesetting documents. Choosing the right programming language for a problem is thus a consideration between different aspects, such as performance constraints, availability of third-party libraries, existing code to build on, expressivity of the language in the problem domain, etc. All these aspects can affect the quality of the software.

In some cases it is more interesting to design and implement a new language instead of using an existing language. However, developing a new programming language requires a significant design and engineering effort. Many design choices need to be made, and the right choice is not always obvious. This can be observed in many existing programming languages which continue to go through several high cost revisions. To aid the language design process, exploratory programming — a development style focused on variant creation and evaluation — can be used to explore the design space in an interactive and programmable manner. On the engineering side, making a programming language executable is already a significant effort. The effort is further increased by the myriad of auxiliary tools aiding developers, such as debuggers and integrations with modern editors. To reduce the engineering efforts, language workbenches can be used, which provide systematic methods for building (domain-specific) languages.

In this thesis we introduce exploratory language development: an approach that aims to improve the language creation process by combining features from language workbenches with a methodology focused on enabling exploratory programming for programming language de- sign. The main goal of exploratory language development is to simplify the process of going from language idea to language prototype, experiment with this prototype, modify the original prototype to create new versions, and evaluate the different prototypes with the objective of obtaining insights that feedback into the design process. To this end, we design a reusable framework for exploratory programming; we design a meta-language which is focused on variability in the language design process; we design an approach that automatically derives auto-completion systems from the semantics of a programming language; and we define a reusable framework for debugging of non-deterministic programs. These different contributions

Scroll to Top