Students are expected to have completed (the lab of) the compiler construction course IN4303.

Course Contents

"Software systems are the engines of modern information society. Our ability to cope with the increasing complexity of software systems is limited by the programming languages we use to build them. Bridging the gap between domain concepts and the implementation of these concepts in a programming language is one of the core challenges of software engineering. Modern programming languages have considerably reduced this gap, but often still require low-level programmatic encodings of domain concepts. Or as Alan Perlis formulated it in one of his famous epigrams: 'A programming language is low level when its programs require attention to the irrelevant'. A fixed set of (Turing Complete) programming constructs is sufficient to express all possible computations, but at the expense of considerable encoding that obfuscates the concepts under consideration. Linguistic abstraction can be used as a tool to capture our emerging understanding of domains of computation." (Visser, SCP 2014)

In the precursor compiler construction course (IN4303), students learn the basics of language engineering and build a complete definition for a small programming language. In this course, students learn to apply language engineering principles and tools to a real (domain-specific) programming language in a new project, i.e. without following a path set out in detail by the instructor. Thus, they will experience that the design of a real programming languages requires trade-offs and compromises. Typically, students implement a previously existing language. But designing a new language is also an option provided there is a good plan that is discussed _before_ the course starts.

Study Goals

Learn to apply language engineering principles and tools to a real (domain-specific) programming language. Explore the definition of all aspects of a programming language: syntax, name binding, type analysis, transformations, code generation.

Education Method

This is a project course. Students deepen their language engineering skills and insights by building a complete language definition. Students work in teams of two on the definition of a (domain-specific) programming language using the Spoofax Language Workbench. Assistance and feedback is provided during weekly lab hours. The project should span the full life cycle of language implementation including a test suite, IDE, code generator, and distribution of the result as an Eclipse plugin.

Literature and Study Materials

- Documentation of the design and implementation of a specific language- Papers about language definition techniques

Books

See Literature and Study Materials

Assessment

The work is assessed based on a code review of the language definition, a written report about the project, and a presentation in the final project workshop.