Generative Programming and Component Engineering

Generative Programming and Component Engineering

Peter D. Mosses

Now available: Slides

BRICS and Department of Computer Science, University of Aarhus, Denmark

Peter Mosses participated in the development of Denotational Semantics, in Strachey's Programming Research Group at Oxford in the early 1970's. Since moving to Aarhus in 1976, the general aim of his research in the area of semantics has been to combine solid theoretical foundations with practical applicability. He has focussed on improving the modularity of semantic descriptions, making some major advances in this direction. His most recent work provides the basis for a radically new approach to the development of semantic descriptions. He has also contributed to CoFI, the Common Framework Initiative for Algebraic Specification and Development of Software, and the design of CASL, the Common Algebraic Specification Language (

Invited Talk on Modular Language Descriptions

Formal semantic descriptions of full-scale programming languages can be notoriously difficult to write, as well as to read. Writing a description of a language usually starts from scratch: reuse from previous language descriptions requires first locating a relevant one, then manually copying bits of it -- perhaps with extensive reformulation. Semantic descriptions are often intricate and intimidating documents to read, requiring a good grasp of the formalism used, as well an understanding of the interplay between the parts of the description concerned with different language constructs. Evolution of semantic descriptions, to cope with small changes or extensions to the described language, may require global reformulation.

In other words: however elegant the theoretical foundations of semantic descriptions may be, their pragmatic aspects are often reminiscent of programming large systems before modern software engineering techniques were introduced. A good dose of 'semantics engineering' is needed: analogous partly to component engineering (raising the level of modularization and analysis in semantic descriptions), partly to the use of domain-specific formalisms (elevating semantic descriptions to compact domain-specific notations that are easier to read, write and maintain).

The most extreme modularization imaginable in semantic descriptions is when each individual programming construct is described as a separate and independent component. For instance, consider a particular kind of conditional statement: its description is to be independent of whether evaluating the condition might have side-effects, throw exceptions, etc. Such modules could be made available in a repository; a description of a complete language would then merely refer to the required modules, which must not need any adaptation when combined. Reuse would be encouraged, and made explicit. The designer of a new language would be free to focus on the description of novel constructs.

Unfortunately, some well-known semantic frameworks (e.g., conventional Structural Operational Semantics and Denotational Semantics) do not allow such extreme modularization as envisaged above: the description of each language construct inherently depends on which other (kinds of) constructs are included in the language being described. Other frameworks go quite a long way towards it (e.g., Monadic Denotational Semantics, and the Montages variant of Abstract State Machines). The following two lesser-known frameworks have recently been adapted specifically to support extreme modularization:

  • Action Semantics -- a hybrid of operational and denotational semantics, developed since the end of the 80's (not to be confused with the action semantics of UML); and

  • Modular SOS (MSOS) -- a variant of Structural Operational Semantics where labels on transitions are fully exploited.

Action Semantics appears to be an appropriate basis for generation of prototype compilers, and some tool support for developing and validating semantic descriptions has been implemented. MSOS has so far been used in earnest only for defining the Action Notation used in Action Semantics, and for teaching semantics. Both frameworks are quite unbiased towards description of particular kinds of programming languages, and their support for extreme modularization should make them especially attractive for describing domain-specific languages.