Oberon || Compiler & Tools || Library || Module Index || Search Engine

Ulm's Oberon System:


oc - Oberon compiler


oc [ option ] ... file ...


oc is Ulm's Oberon compiler. The accepted language is defined by the revised Oberon report from 1989 with following exceptions:
Definition and implementation parts must be separate. The current version of the Oberon compiler does not accept export marks:
$ identdef = ident .
The relaxed parameter compatibility rule for the formal type ARRAY OF BYTE applies for variable and value parameters.
Variable parameters do not require type identity in case of pointer types.
The syntax of the import list has been changed to:
$ ImportList = IMPORT import { "," import } ";" .
$ import = identdef [":=" ident ] .
Comments may be nested.

(1), (2), and (3) conform to unrevised Oberon. (4) and (5) conform to newer revisions.

The Oberon compiler accepts two kinds of sources: definitions and modules. The definition is an excerpt of the module and specifies the items visible to all clients importing the module. Definitions and modules are textually separated. The suffix of the filename determines the kind of source: `.od' for definitions and `.om' for modules.

The Oberon compiler accepts several types of arguments: Arguments whose names end with `.om' are taken to be Oberon modules; they are compiled, and each object program is left in the file whose name is the basename of the source with `.o' substituted for `.om'. Further a reference file with suffix `.r' is left. See odb for more information. Names ending with `.od' are taken to be Oberon definitions and compiled, producing a `.sy' file. Symbol files and reference files may be archived in the files `SYM' and `REF'. If these archives exist oc tries to archive the corresponding output files.

In the same way, arguments whose names end with `.s' are taken to be assembly source programs and are assembled, producing a `.o' file.

The following options are interpreted by oc.

Suppress archiving of the reference and symbol files even if `SYM' and `REF' exist.
Suppress the loading phase of the compilation. A single object file can be named explicitly using the -o option.
Requests parameterless exported procedures of the given modules to be accessible as commands. See SysCommands for further reference.
Requests all output files to be put into the directory destdir.
Causes oc to ignore compilation errors of all sources following this option. The exit code of oc equals the number of failed compilations.
Requests the libdir to be included in front of the search path for libraries. libdir must be either absolute (i.e. pathname beginning with "/") or a subdirectory of one of the directories specified by OBPATH or OBLIB (see below). Note that despite to cc(1) and ld(1) this option must appear before the sources.
Arrange the compiler to produce a listing for each source file in a corresponding `.l' file, or in a `.ld' file if the source is a definition.
-o output
Name the final output file output. The output file may be either an object file (if the loading phase is suppressed and only one argument is given), an archive with suffix `.a' (this causes the loading phase to be suppressed implicitly), or the designated output file of the loading phase. In the last case the file `a.out' will be left undisturbed.
Set the default value of compiler option L (upper case letter) to FALSE. Options not modified by the command line have an initial value of TRUE. The options can also be set from within a Oberon source using a comment as follows:
(* $R- $I+ $N= *)
sets compiler option R to FALSE, I to TRUE, and restores the previous value of N. Whitespace is permitted and `$' precedes the option letters. Following options are currently supported:
requests checks to be generated for conversions from INTEGER to SHORTINT.
enables the yet undocumented revisions of Oberon: (4) and (5) as described above.
this option causes the two least significant bits of the type tag to be masked out on each access. This may be useful for some garbage collecting algorithms and requires this option to be applied for all modules.
requests pointer types to point to tagged data structures. This options is to be switched off for pointer types which are intended to point to areas which have not been created by NEW. These pointer types will not be traced on garbage collections. IS operators or WITH statements are rejected by the compiler for untagged pointers.
requests pointer types to be traced on garbage collections. This option must be switched off in cases where pointers refer to untagged locations. Only types which contain pointers are affected by this option. In case of exported types only the setting in the definition is considered by the compiler.
enables parameter types to be given as required by revised Oberon.
if switched on, not only strings of length 1 are treated as possible strings but also all other character constants, e.g. 4X, MAX(CHAR), CAP("A"), CHR(4). While the report doesn't encourage this interpretation, the Zürich compilers treat all these character constants as possible strings of the length 1.
causes range checks for array indices to be generated.
Suppress cleanup of archived files.
Suppress clean up of temporary files.
Causes the symbol table of the output file to be stripped of. This implies that debuggers cannot be used. The symbol table can also be removed by strip(1).
Compile the named Oberon modules, and leave the assembler-language output on corresponding files suffixed `.s'.
Allocate the temporary files of the compiler in the directory dir.
Enables the Oberon compiler to patch symbol files on compilation of the corresponding module. This is required in case of record type extensions (i.e. a record type of the definition is a public projection of the corresponding record type of the module). If -u is not given the compiler compares the the size needed with the size found in the symbol file (determined either by the compilation of the definition or by an earlier update). If the size is not sufficient the compiler gives an error message: "required type extension is prohibited; use -u option".
Forces the Oberon compiler to patch symbol files if sizes are different, i.e. if the implementation of an record is smaller than the (already patched) size in the symbol file then -u wouldn't cause an update but -U.
Verbose flag. oc prints all executed commands to standard output.
Show but do not execute the commands constructed by the compilation driver.

Other arguments are Oberon object programs (suffix `.o'), typically produced by an earlier oc run, or Oberon libraries (suffix `.a'). These programs, together with the results of any compilations specified, are loaded (in the order given) to produce an executable program with name a.out.


oc looks for two environment parameters: OBLIB and OBPATH. If OBLIB is given oc calls the compiler passes in the directory $OBLIB. OBPATH specifies a list of directories, separated with colons (like PATH). Each of these directories consists of a SYM archive of symbol files, a REF archive of reference files, and archives with suffix `.a'. If the compiler looks for a symbol file or ld(1) for library modules this search path is used.


Oberon definition
Oberon module
archive with symbol files
archive with reference files
object file
symbol file
reference file
listing of an Oberon module
listing of an Oberon definition
loaded output
temporaries for oc
compiler for oc
runtime start-off
executed after initialization of all modules
standard library
symbol files of the std library
reference files of the std library


Niklaus Wirth, The Programming Language Oberon, Software--Practice and Experience, 18, 7 (July 1988), 671-690
Niklaus Wirth, The Programming Language Oberon (revised Report), Eidgenössische Technische Hochschule Zürich, Report 111, September 1989
Andreas Borchert, Report of Ulm's Oberon Compiler, University of Ulm, SAI
ld(1), odb, mmo, SysCommands


The diagnostics produced by the compiler itself are intended to be self-explanatory. Occasional messages may be produced by the assembler or loader.

Error messages of the loader about undefined symbols of the form O_modulename_digits_digits result from key mismatches. In this case it is recommended to recompile all sources in the appropriate order.


The first 11 characters of the module name should be identical to the file name. This avoids silent truncation of suffixes when symbol files, reference files, and objects get archived.


Not yet implemented:
detection of erroneous constant floating point expressions
LONGREAL floating point constants
good error recovery on syntactic errors

The Oberon compiler does not support shared libraries.

ar(1) allocates its temporary files either in /tmp or in the current directory. Thus -T dir causes ar(1) only to change the temporary files directory if dir equals ".".


Andreas Borchert and Martin Hasch, University of Ulm
Edited by: borchert, last change: 1996/01/04, revision: 1.13, converted to HTML: 2001/04/05

Oberon || Compiler & Tools || Library || Module Index || Search Engine