The Oberon+ Programming Language

A lean, statically typed, compiled, general-purpose, procedural, object-oriented, and garbage collected programming language in the Pascal tradition, with support for generic programming

View it on GitHub

16 July 2021

Comparing Oberon+ with Oberon-2 and Oberon-07

by Rochus Keller

The Oberon+ language definition started as a union of the Oberon-07 and Oberon-2 language definitions. Since both Oberon-2 and Oberon-07 are an extension of the first Oberon version (1987 and 1990), the Oberon+ language definition therefore also includes the original Oberon language. This means, that in principle each program written in Oberon up to Oberon-2 and including Oberon-07 is compatible with the Oberon+ compiler. There is one exception at which we will look below.

Oberon-2 added the following elements to the original Oberon:

Oberon-07 (revision 3.5.2016) also describes itself as an extension of the original Oberon (thus ignoring most of the Oberon-2 extensions); here is a list of the major changes in Oberon-07:

Since Oberon+ includes a union of Oberon-2 and Oberon-07, all removals done by Oberon-07 besides the last one (“non-local access”) are ignored. The resulting redundancy with WITH and type CASE is tolerated in favor of compatibility. To accomodate the effect of the Oberon-07 RETURN, procedure bodies can either consist of BEGIN plus statement sequence, or a RETURN statement. Oberon-07 programs with read-only access to imported module variables still run on Oberon+ without modification (they simply do without write access); if the author of an Oberon-07 module wants to enforce read-only exports of the module variables, visibility mark must be changed to “-“.

The missing non-local access of Oberon+ can cause incompatibilities with programs written in original Oberon or Oberon-2, although only a fraction of the existing code seems to use this feature. Whether it is feasible and worthwhile to add it to Oberon+ is subject to further investigations. In any case a simple work-around is to pass the required objects as VAR or IN parameters to the nested procedures.

In addition to the above, Oberon+ adds the following:

Pending features of Oberon+:

Features in evaluation: