# Oberon/compilers

This document was originally hosted at the ETHZ. It remains under the ETH license and is in the WayBack archive.
| Name | Technology | Languages supported | Features | Front-End Authors | Back-End Authors |
| Ceres | 1-pass recursive descent parser, direct code generation | Oberon | | N. Wirth, J. Gutknecht | NS32xxx: N. Wirth ARM: N. Wirth StrongARM: A. Signer |
| OberonSA | 1-pass recursive descent parser, direct code generation | OberonSA = Oberon subset | | N. Wirth | OLGA: N. Wirth |
| NOSAP | 1-pass recursive descent parser, direct code generation | OberonSA extension | | M. Sanvido | OLGA: M. Sanvido |
| OP2 | 1-pass recursive descent parser, generates intermediate parse tree | Oberon, Oberon-2 | Fine grained fingerprinting, front-end + back-end architecture | (1989) R. Crelier | (1989) MIPS: R.Crelier (1989) i386: N. Mannhart (1989) 68000: M. Franz (1989) SPARC: J. Templ (1990) Amiga: S. Ludwig, C. Nieder, R Degner (1991) Power: M. Brandis (1991) PA-RISC: J. Supcik (1994) PowerPC: T. Kistler, A. Wuerz - Uni Linz (1994) OMI: M. Franz, T. Kistler (1995) DEC/HP Alpha (64 bit): Guenter Dotzel, Hartmut Goebel, Peter Pirkelbauer, Don Ward |
| Enhanced OP2 | 1-pass recursive descent parser, intermediate parse tree | Oberon, Oberon-2, Oberon-X, Active Oberon, Embedded Assembler | Fine grained fingerprinting, front-end + back-end architecture | R. Crelier, P. Reali - additions | i386: P. Reali SPARC: G. Feldmann (additions) |
| Paco | 1-pass recursive descent, scope concurrent parser | Oberon, Active Oberon, Embedded Assembler | front-end + back-end architecture, dynamically pluggable code generators, concurrent | P. Reali | i386 for Paco: P. Reali, StrongARM: B. Egger |
| Oberon.Net | 1-pass recursive descent parser | Active Oberon for .net | | J. Gutknecht, B. Smith-Mannschott, H.P. Hoegger, P. Kramer, T. Frey | Back-end: MS-IL |
| Hyperstone Oberon | 2-pass front-end+back-end compiler | Oberon | | H.P. Hoegger | Hyperstone: P. Kramer Kernel: T. Frey, O. Joos |
| OP2 T800 cross compiler | 1-pass recursive descent parser; generates intermediate parse tree. | Oberon-2 | Fine-grained fingerprinting absent. Metaprogramming absent | (1989) R. Crelier | (1994) Stephane Micheloud; |
| OS | ETH Oberon Port | Front-end | Back-end | B.E. maintainer |
| Native | Native Oberon | Enh. OP2 | i386 | Patrik Reali |
| Linux | Linux Native Oberon (LNO) | Enh. OP2 | i386 | Peter Matthias |
| Linux | Oberon for Linux x86 | Enh. OP2 | i386 | Günter Feldmann |
| Linux | Oberon for Linux PPC | Enh. OP2 | PPC | Günter Feldmann |
| Solaris | Oberon for Solaris x86 | Enh. OP2 | i386 | Günter Feldmann |
| Solaris | Oberon for Solaris SPARC | Enh. OP2 | SPARC | Günter Feldmann |
| MacOs X | Oberon for Mac OS X | Enh. OP2 | PPC | Günter Feldmann |
| Windows | PlugIn Oberon for Windows | Enh. OP2 | i386 | |
| Bluebottle | Oberon for Bluebottle | Paco | i386 for Paco | Patrik Reali |
| Bluebottle | Oberon for Bluebottle | Paco | ARM for Paco | Bernhard Egger |
| Bluebottle | Oberon for Bluebottle | Enh. OP2 | i386 | Patrik Reali |
Front-end maintainer
Difference between OP2 and Paco
Paco differs from OP2 in the following aspects
* Paco is a completely new compiler written in Active Oberon. It relies on active objects for its execution: every scope is parsed concurrently by a parser object. This is currently not faster, but simplifies the handling of forward references.
* Language support: no Oberon-2 support and limited support for Oberon-X (semi-dynamic arrays, user defined return types)
* Intermediate representation: low-level assembler-like representation close to a SSA-form (infinite registers, assigned once).
* Back-end: hot-pluggable back-ends (currently i386 and StrongARM)
Note concerning the PowerPC compiler for LinuxPPC and MacOs X
In the enhanced PowerPC compiler, introduced in release 2.3.8, the bit order of sets is compatible with the other compilers (x86, SPARC, ...) (SYSTEM.VAL(LONGINT, {0}) = 1).
The old PowerPC compiler, used in MacOberon and PowerOberon (V4) (see below), represents sets in reversed bit order ({0} = 2^31). This makes mixed integer and set operations with type coercions (which are heavily needed in encryption algorithms) unportable. It was probably one of the goals of module BIT to overcome this incompatibility. But the use of module BIT makes algorithms less readable and less efficient.
| OS | ETH Oberon Port | Front-end | Back-end |
| Native | SharkOberon for DNARD | Ceres | ARM |
| Native | Dos-Based Native Oberon | Enh. OP2 | i386 |
| Windows | Oberon for Windows | Enh. OP2 | i386 |
| Windows 3.x | Oberon System 3 for Windows | OP2 | i386 + OMI |
| MacOs | MacOberon System 3 | OP2 | PPC / 68000 + OMI |
| MacOs 6.x to 9.x | MacOberon | OP2 | PPC + OMI |
| HP-UX | Oberon System 3 for HP-UX | OP2 | PA-RISC |
Note concerning Slim Binaries, often referred to as "OMI"
OMI is now history and not implemented in the current ETH Oberon system. This very interesting technology was not integrated into the new compiler because we did change the language many times and this required some deep changes to the compiler. The OMI implementation we had (and still have) was optimized for the OP2 parse tree to the extent that changing anything in the parse tree or symbol table would break or cripple it, and it should have been de-optimized first or even rewritten for the new parse tree. Anyway, this is still possible, and it would be interesting, to have somebody take over the OMI code and adapt it to the extended symbol table and parse tree used for Active Oberon.
A number of earlier ports written in the context of the Oberon V4 project are still downloadable though not maintained since:
* MacOberon - Motorola 680x0
* SPARC-Oberon - Sun SPARC
* Oberon for Amiga - Motorola 680x0
* POWERoberon - IBM RISC System/6000
* HP-Oberon - HP Apollo Series 700
* Power MacOberon - PowerPC
| Documents written or revised for ETH Oberon | Web | Included in the distribution |
| The Programming Language Oberon (Report) | html | OberonReport.html, OberonReport.ps |
| Oberon EBNF | html | OberonEBNF.ps |
| The module SYSTEM | html | No |
| Active Oberon Language extension | html | No |
| Active Oberon Language Report | html | No |
| Active Oberon for .net White Paper | MS Word doc | No |
| Oberon-X extension | html | No |
| Oberon Kurs, by Günther Sawitzki | html | No |
| Introduction to Oberon, by Günther Sawitzki | html | No |
| Documents written for Oberon V4 | Postscript | gnu-comp | V4 text [1] | TeX | HTML |
| From Modula Oberon (Report) | ps | ps.gz | Text | | |
| The Programming Language Oberon (Report) | ps | ps.gz | Text | | here |
| Oberon EBNF | ps | ps.gz | Text | | |
| The Programming Language Oberon-2 (Report) | ps | ps.gz | Text | Excelsior | UCSD UUlm |
| Differences between Oberon and Oberon-2 | ps | ps.gz | Text | | |
| Oberon-2 Change List | ps | ps.gz | Text | | here |
| Object-Oriented Programming in Oberon-2 | ps | ps.gz | Text | | |
| The Oberon Guide - System Release 1.2 | ps | ps.gz | Text | | |
Note [1]: An Oberon Text file can not be displayed by a conventional browser. In V4 it is displayed with an editor. In ETH Oberon, after opening, the text must be converted to ETH Oberon text by executing WTS.Convert Temp.FTP.Text. The converted text replaces the original one.
* Language FAQ
* Code Examples
* Hostess: the Oberon Compiler Test Suite [ hostess.sourceforge.net ]
* Compiler Options
* Trap Numbers (Enhanced OP2 and Paco only)
* ETH Technical Report 125: R. Crélier; OP2: A Portable Oberon Compiler [ PDF. Open the ETH technical reports page and search for "Portable Oberon" ]
* Compiler Construction by Niklaus Wirth
* The Art of Assembly Language Programming
* Assembly language Wikibooks.
* Native 2.3.6 and earlier [ html | pdf ]
* Native alpha and beta versions, 2.3.7 Unix Versions [ html | pdf ]
* Aos/Bluebottle Releases Nov. 17, 06 and later [ html | pdf ]
* Intel Processor Manuals
* Built-in Intel386 assembler: documentation (by J. Eloff), instruction list
* Assembly language in Wikipedia.
* X86 Assembly Wikibook.
In our experience, it is relatively easy to write a simple Wirth-like compiler for a new architecture. For example, A. Signer, at that time a student, wrote the compiler back-end for the StrongARM and ported the ETH Oberon system in four months.
The advantage of a Wirth compiler is that it is based on a few fixed code patterns that are generated directly, without first building an internal representation of the program. This simplifies the design significantly.
Paul Reed changed the code pattern procedures to upcalls, which allows him to plug in different code generators.
Of course, it is easier to implement optimizations in a compiler that supports an internal intermediate form, like OP2, but the added complexity only pays off if you actually have time to study and implement the optimization algorithms.
The canonical version is at ftp://ftp.ethoberon.ethz.ch/Oberon/Books/ProjectOberon/ [expired]
28 Oct 2002 - Copyright © 2002 ETH Zürich. All rights reserved. E-Mail: oberon at lists.inf.ethz.ch Homepage: http://www.ethoberon.ethz.ch/

## References

* ↑ An Oberon Compiler for the ARM Processor
* ↑ http://www.modulaware.com/mwofea.htm#cre94
* ↑ DEC_Alpha
* ↑ http://www.modulaware.com/mwovms.htm
* ↑ T800 announcement and download links at http://www.modulaware.com/mdlt/?n=89#t800-op2.