fbpx
Wikipedia

Oberon-2

Oberon-2 is an extension of the original Oberon programming language that adds limited reflective programming (reflection) and object-oriented programming facilities, open arrays as pointer base types, read-only field export, and reintroduces the FOR loop from Modula-2.

It was developed in 1991 at ETH Zurich by Niklaus Wirth and Hanspeter Mössenböck, who is now at Institut für Systemsoftware (SSW) of the University of Linz, Austria. Oberon-2 is a superset of Oberon, is fully compatible with it, and was a redesign of Object Oberon.

Oberon-2 inherited limited reflection and single inheritance ("type extension") without the interfaces or mixins from Oberon, but added efficient virtual methods ("type bound procedures"). Method calls were resolved at runtime using C++-style virtual method tables.

Compared to fully object-oriented languages like Smalltalk, in Oberon-2, basic data types and classes are not objects, many operations are not methods, there is no message passing (it can be emulated somewhat by reflection and through message extension, as demonstrated in ETH Oberon), and polymorphism is limited to subclasses of a common class (no duck typing as in Python,[1] and it's not possible to define interfaces as in Java). Oberon-2 does not support encapsulation at object or class level, but modules can be used for this purpose.

Reflection in Oberon-2 does not use metaobjects, but simply reads from type descriptors compiled into the executable binaries, and exposed in the modules that define the types and/or procedures. If the format of these structures are exposed at the language level (as is the case for ETH Oberon, for example), reflection could be implemented at the library level. It could thus be implemented almost entirely at library level, without changing the language code. Indeed, ETH Oberon makes use of language-level and library-level reflection abilities extensively.

Oberon-2 provides built-in runtime support for garbage collection similar to Java and performs bounds and array index checks, etc., that eliminate the potential stack and array bounds overwriting problems and manual memory management issues inherent in C and C++. Separate compiling using symbol files and namespaces via the module architecture ensure fast rebuilds since only modules with changed interfaces need to be recompiled.

The language Component Pascal[2] is a refinement (a superset) of Oberon-2.

Example code edit

The following Oberon-2 code implements a simple binary tree:

MODULE Trees; TYPE Tree* = POINTER TO Node; Node* = RECORD name-: POINTER TO ARRAY OF CHAR; left, right: Tree END; PROCEDURE (t: Tree) Insert* (name: ARRAY OF CHAR); VAR p, father: Tree; BEGIN p := t; REPEAT father := p; IF name = p.name^ THEN RETURN END; IF name < p.name^ THEN p := p.left ELSE p := p.right END UNTIL p = NIL; NEW(p); p.left := NIL; p.right := NIL; NEW(p.name, LEN(name)+1); COPY(name, p.name^); IF name < father.name^ THEN father.left := p ELSE father.right := p END END Insert; PROCEDURE (t: Tree) Search* (name: ARRAY OF CHAR): Tree; VAR p: Tree; BEGIN p := t; WHILE (p # NIL) & (name # p.name^) DO IF name < p.name^ THEN p := p.left ELSE p := p.right END END; RETURN p END Search; PROCEDURE NewTree* (): Tree; VAR t: Tree; BEGIN NEW(t); NEW(t.name, 1); t.name[0] := 0X; t.left := NIL; t.right := NIL; RETURN t END NewTree; END Trees. 

Oberon-2 extensions to Oberon[3] edit

Type-bound procedures edit

Procedures can be bound to a record (or pointer) type. They are equivalent to instance methods in object-oriented terminology.

Read-only export edit

The use of exported variables and record fields can be restricted to read-only access. This is shown with a "-" visibility flag.

Open arrays edit

Open arrays which formerly could only be declared as formal parameter types may now be declared as pointer base types.

FOR statement edit

The FOR statement of Pascal and Modula-2 was not implemented in Oberon. It is reintroduced in Oberon-2.

Runtime type checking edit

Oberon-2 provides several mechanisms for checking the dynamic type of an object. For example, where a Bird object might be instantiated to either a Duck or a Cuckoo, Oberon-2 allows the programmer to respond to the actual type of the object at runtime.

The first, most conventional, approach is to rely on the type binding system. The second approach is to use the WITH statement, which allows the dynamic subtype of a variable to be checked directly. In both cases, once the subtype has been identified, the programmer can make use of any type-bound procedures or variables that are appropriate to the subtype. Examples of these approaches are shown below.

Note that the form of WITH statement used in Oberon-2 is unrelated to the Pascal and Modula-2 WITH statement. This method of abbreviating access to record fields is not implemented in Oberon or Oberon-2.

Type binding edit

 MODULE Birds; TYPE Bird* = RECORD  sound* : ARRAY 10 OF CHAR; END; END Birds. MODULE Ducks; IMPORT Birds; TYPE Duck* = RECORD (Birds.Bird) END; PROCEDURE SetSound* (VAR bird : Duck); BEGIN bird.sound := "Quack!" END SetSound; END Ducks. MODULE Cuckoos; IMPORT Birds; TYPE Cuckoo* = RECORD (Birds.Bird) END; PROCEDURE SetSound* (VAR bird : Cuckoo); BEGIN bird.sound := "Cuckoo!" END SetSound; END Cuckoos. 

WITH statement edit

 MODULE Test; IMPORT Out, Birds, Cuckoos, Ducks; TYPE SomeBird* = RECORD (Birds.Bird) END; VAR sb : SomeBird; c : Cuckoos.Cuckoo; d : Ducks.Duck; PROCEDURE SetSound* (VAR bird : Birds.Bird); BEGIN WITH bird : Cuckoos.Cuckoo DO  bird.sound := "Cuckoo!"  | bird : Ducks.Duck DO  bird.sound := "Quack!" ELSE  bird.sound := "Tweet!" END END SetSound; PROCEDURE MakeSound* (VAR b : Birds.Bird); BEGIN Out.Ln; Out.String(b.sound); Out.Ln END MakeSound; BEGIN SetSound(c); SetSound(d); SetSound(sb); MakeSound(c); MakeSound(d); MakeSound(sb) END Test. 

POINTER edit

 MODULE PointerBirds; IMPORT Out; TYPE BirdRec* = RECORD  sound* : ARRAY 10 OF CHAR; END; DuckRec* = RECORD (BirdRec) END; CuckooRec* = RECORD (BirdRec) END; Bird = POINTER TO BirdRec; Cuckoo = POINTER TO CuckooRec; Duck = POINTER TO DuckRec; VAR pb : Bird; pc : Cuckoo; pd : Duck; PROCEDURE SetDuckSound* (bird : Duck); BEGIN bird.sound := "Quack!" END SetDuckSound; PROCEDURE SetCuckooSound* (bird : Cuckoo); BEGIN bird.sound := "Cuckoo!" END SetCuckooSound; PROCEDURE SetSound* (bird : Bird); BEGIN WITH bird : Cuckoo DO  SetCuckooSound(bird)  | bird : Duck DO  SetDuckSound(bird) ELSE  bird.sound := "Tweet!" END END SetSound; BEGIN NEW(pc); NEW(pd); SetCuckooSound(pc); SetDuckSound(pd); Out.Ln; Out.String(pc^.sound); Out.Ln; Out.Ln; Out.String(pd^.sound); Out.Ln; SetSound(pc); SetSound(pd); Out.Ln; Out.String(pc^.sound); Out.Ln; Out.Ln; Out.String(pd^.sound); Out.Ln; (* -------------------------------------- *) (* Pass dynamic type to procedure *) pb := pd; SetDuckSound(pb(Duck)); Out.Ln; Out.String(pb^.sound); Out.Ln; pb := pc; SetCuckooSound(pb(Cuckoo)); Out.Ln; Out.String(pb^.sound); Out.Ln; (* -------------------------------------- *) SetSound(pb); Out.Ln; Out.String(pb^.sound); Out.Ln; pb := pd; SetSound(pb); Out.Ln; Out.String(pb^.sound); Out.Ln; (* -------------------------------------- *) NEW(pb); SetSound(pb); Out.Ln; Out.String(pb^.sound); Out.Ln END PointerBirds. 

IS operator edit

A third approach is possible using the IS operator. This is a relation operator with the same precedence as equals (=), greater (>), etc. but which tests dynamic type. Unlike the two other approaches, however, it does not allow the programmer access to the subtype that has been detected.

Syntax edit

The development of the ALGOLPascalModula-2 → Oberon → Component Pascal language family is marked by a reduction in the complexity of the language syntax. The entire Oberon-2 language is described (Mössenböck & Wirth, March 1995) using only 33 grammatical productions in the extended Backus–Naur form, as shown below.

Module = MODULE ident ";" [ImportList] DeclSeq [BEGIN StatementSeq] END ident ".". ImportList = IMPORT [ident ":="] ident {"," [ident ":="] ident} ";". DeclSeq = { CONST {ConstDecl ";" } | TYPE {TypeDecl ";"} | VAR {VarDecl ";"}} {ProcDecl ";" | ForwardDecl ";"}. ConstDecl = IdentDef "=" ConstExpr. TypeDecl = IdentDef "=" Type. VarDecl = IdentList ":" Type. ProcDecl = PROCEDURE [Receiver] IdentDef [FormalPars] ";" DeclSeq [BEGIN StatementSeq] END ident. ForwardDecl = PROCEDURE "^" [Receiver] IdentDef [FormalPars]. FormalPars = "(" [FPSection {";" FPSection}] ")" [":" Qualident]. FPSection = [VAR] ident {"," ident} ":" Type. Receiver = "(" [VAR] ident ":" ident ")". Type = Qualident  | ARRAY [ConstExpr {"," ConstExpr}] OF Type  | RECORD ["("Qualident")"] FieldList {";" FieldList} END  | POINTER TO Type  | PROCEDURE [FormalPars]. FieldList = [IdentList ":" Type]. StatementSeq = Statement {";" Statement}. Statement = [ Designator ":=" Expr  | Designator ["(" [ExprList] ")"]  | IF Expr THEN StatementSeq {ELSIF Expr THEN StatementSeq} [ELSE StatementSeq] END  | CASE Expr OF Case {"|" Case} [ELSE StatementSeq] END  | WHILE Expr DO StatementSeq END  | REPEAT StatementSeq UNTIL Expr  | FOR ident ":=" Expr TO Expr [BY ConstExpr] DO StatementSeq END  | LOOP StatementSeq END  | WITH Guard DO StatementSeq {"|" Guard DO StatementSeq} [ELSE StatementSeq] END  | EXIT  | RETURN [Expr] ]. Case = [CaseLabels {"," CaseLabels} ":" StatementSeq]. CaseLabels = ConstExpr [".." ConstExpr]. Guard = Qualident ":" Qualident. ConstExpr = Expr. Expr = SimpleExpr [Relation SimpleExpr]. SimpleExpr = ["+" | "-"] Term {AddOp Term}. Term = Factor {MulOp Factor}. Factor = Designator ["(" [ExprList] ")"] | number | character | string | NIL | Set | "(" Expr ")" | "~" Factor. Set  = "{" [Element {"," Element}] "}". Element = Expr [".." Expr]. Relation = "=" | "#" | "<" | "<=" | ">" | ">=" | IN | IS. AddOp = "+" | "-" | OR. MulOp = "*" | "/" | DIV | MOD | "&". Designator = Qualident {"." ident | "[" ExprList "]" | "^" | "(" Qualident ")"}. ExprList = Expr {"," Expr}. IdentList = IdentDef {"," IdentDef}. Qualident = [ident "."] ident. IdentDef = ident ["*" | "-"]. 

Implementations edit

Oberon-2 compilers maintained by ETH include versions for Windows, Linux, Solaris, macOS.

The Oxford Oberon-2 compiler compiles to native machine code and can use a JIT on Windows, Linux, and macOS. It is created and maintained by Mike Spivey and uses the Keiko Virtual Machine.[4][5]

There is an Oberon-2 Lex scanner and Yacc parser by Stephen J. Bevan of Manchester University, UK, based on the one in the Mössenböck and Wirth reference. It is at version 1.4.

There is a release named Native Oberon which includes an operating system, and can directly boot on PC class hardware.

A .NET implementation of Oberon with the addition of some minor .NET-related extensions has been developed at ETHZ.

Programmer's Open Workbench (POW!)[6] is a very simple integrated development environment, which is provided with editor, linker, and Oberon-2 compiler. This compiles to Windows executables. Full source code is provided; the compiler is written in Oberon-2.

The (JOB) was written at the University of Vologda in Russia. It produces object code in the form of Java class files (bytecode). Some JOB-specific classes are provided which are Java compatible, but which use a more Oberon-like component hierarchy.

The Optimizing Oberon-2 Compiler compiles to C, using the GNU Compiler Collection (GCC) toolchain for program generation.

Oberon Script is a compiler that translates the full Oberon language into JavaScript. The compiler is written in JavaScript and can thus be called from Web pages to process scripts written in Oberon.

is a development system by Excelsior LLC, Novosibirsk, Russia. It contains an optimizing compiler for Intel Pentium, or "via-C" translator for cross-platform software development. Available for Windows and Linux. The compiler is written in Oberon-2 and compiles itself.

Oberon Revival is a project to bring Oberon 2 and Component Pascal (BlackBox Component Builder) to Linux and Win32. The Linux port of BlackBox was unavailable before and it originally ran on only Microsoft Windows.

XOberon is a real-time operating system for PowerPC, written in Oberon-2.

The Portable Oberon-2 Compiler (OP2) was developed to port the Oberon System onto commercially available platforms.[7]

Keiko bytecode edit

Oberon-2 can target the Keiko Virtual machine.[8][9] For example, like some other language compilers (see O-code, p-code, etc.), the Oxford Oberon-2 compiler first compiles to an intermediate bytecode (Keiko bytecode) which can be interpreted with a byte-code interpreter or use just-in-time compilation.

See also edit

References edit

  1. ^ "Related Reading". Dr. Dobb's.
  2. ^ Pfister, Cuno (2001). (PDF). Oberon microsystems. Archived from the original (PDF) on 15 May 2011. Retrieved 10 January 2007.
  3. ^ Differences between Oberon and Oberon-2, Mössenböck and Wirth (1993)
  4. ^ Spivey, Michael (2014). . Spivey's Corner (Report). Oriel College, University of Oxford. Archived from the original on 4 March 2016. Retrieved 9 July 2023.
  5. ^ Spivey, Michael (30 September 2020). Design overview for OBC: The Keiko Abstract Machine. Spivey's Corner (Report). Oriel College, University of Oxford. Retrieved 9 July 2023. The Oxford Oberon-2 compiler translates source programs into code for a stack-based abstract machine. ... the Keiko machine.
  6. ^ Collingbourne, H. (February 2000). "What Pascal's inventor did next". PC Plus. No. 160.
  7. ^ Crelier, Régis (1994). Separate Compilation and Module Extension (PhD). ETH Zurich. doi:10.3929/ethz-a-000945227. hdl:20.500.11850/141604. Retrieved 18 November 2018.
  8. ^ Dr. Michael Spivey. .
  9. ^ Dr. Michael Spivey. "Design overview for OBC: The Keiko Abstract Machine". quote: "The Oxford Oberon--2 compiler translates source programs into code for a stack-based abstract machine... the Keiko machine"

Further reading edit

  • "" maintained at ETHZ
  • "Second International Modula-2 Conference", September 1991.
  • From Modula to Oberon Wirth (1990)
  • Programming in Oberon - A derivative of Programming in Modula-2 Wirth (1982)
  • The Programming Language Oberon Wirth (1990)
  • Oberon 2 Report
  • The Programming Language Oberon-2 H. Mössenböck, N. Wirth, Institut für Computersysteme, ETH Zurich, January 1992 and Structured Programming (1991) 12(4): 179-195.
  • Various references including electronic online versions
  • Object-Oriented Programming in Oberon-2 Hanspeter Mössenböck (1994). (Available from Johannes Kepler University as PDF with the friendly permission of Springer-Verlag)
  • Design Patterns in Oberon-2 and Component Pascal
  • Project Oberon. The design of an Operating System and Compiler Niklaus Wirth & Jürg Gutknecht (2005)
  • Project Oberon. The design of an Operating System and Compiler Niklaus Wirth & Jürg Gutknecht (2013)

External links edit

  • Official website, ETH Zürich
  • Oberon at SSW, Linz
  • Pow Tutorial (in Romanian language), by Dan Popa
  • ftp://ftp.inf.ethz.ch/pub/Oberon/
  • The Oberon-2 Reflection Model and its Applications

oberon, this, article, multiple, issues, please, help, improve, discuss, these, issues, talk, page, learn, when, remove, these, template, messages, this, article, relies, excessively, references, primary, sources, please, improve, this, article, adding, second. This article has multiple issues Please help improve it or discuss these issues on the talk page Learn how and when to remove these template messages This article relies excessively on references to primary sources Please improve this article by adding secondary or tertiary sources Find sources Oberon 2 news newspapers books scholar JSTOR April 2011 Learn how and when to remove this message This article s use of external links may not follow Wikipedia s policies or guidelines Please improve this article by removing excessive or inappropriate external links and converting useful links where appropriate into footnote references February 2024 Learn how and when to remove this message Learn how and when to remove this message Oberon 2 is an extension of the original Oberon programming language that adds limited reflective programming reflection and object oriented programming facilities open arrays as pointer base types read only field export and reintroduces the FOR loop from Modula 2 Oberon 2ParadigmsImperative structured modular object orientedFamilyWirth OberonDesigned byNiklaus WirthHanspeter MossenbockDeveloperETH ZurichFirst appeared1991 33 years ago 1991 Typing disciplineStrong hybrid static and dynamic ScopeLexicalPlatformCeres NS32032 IA 32 x86 64OSWindows Linux Solaris macOSWebsitewww wbr ethoberon wbr ethz wbr chInfluenced byOberon Modula 2 Object OberonInfluencedOberon 07 Zonnon Active Oberon Component Pascal Go Nim It was developed in 1991 at ETH Zurich by Niklaus Wirth and Hanspeter Mossenbock who is now at Institut fur Systemsoftware SSW of the University of Linz Austria Oberon 2 is a superset of Oberon is fully compatible with it and was a redesign of Object Oberon Oberon 2 inherited limited reflection and single inheritance type extension without the interfaces or mixins from Oberon but added efficient virtual methods type bound procedures Method calls were resolved at runtime using C style virtual method tables Compared to fully object oriented languages like Smalltalk in Oberon 2 basic data types and classes are not objects many operations are not methods there is no message passing it can be emulated somewhat by reflection and through message extension as demonstrated in ETH Oberon and polymorphism is limited to subclasses of a common class no duck typing as in Python 1 and it s not possible to define interfaces as in Java Oberon 2 does not support encapsulation at object or class level but modules can be used for this purpose Reflection in Oberon 2 does not use metaobjects but simply reads from type descriptors compiled into the executable binaries and exposed in the modules that define the types and or procedures If the format of these structures are exposed at the language level as is the case for ETH Oberon for example reflection could be implemented at the library level It could thus be implemented almost entirely at library level without changing the language code Indeed ETH Oberon makes use of language level and library level reflection abilities extensively Oberon 2 provides built in runtime support for garbage collection similar to Java and performs bounds and array index checks etc that eliminate the potential stack and array bounds overwriting problems and manual memory management issues inherent in C and C Separate compiling using symbol files and namespaces via the module architecture ensure fast rebuilds since only modules with changed interfaces need to be recompiled The language Component Pascal 2 is a refinement a superset of Oberon 2 Contents 1 Example code 2 Oberon 2 extensions to Oberon 3 2 1 Type bound procedures 2 2 Read only export 2 3 Open arrays 2 4 FOR statement 2 5 Runtime type checking 2 5 1 Type binding 2 5 2 WITH statement 2 5 3 POINTER 2 5 4 IS operator 3 Syntax 4 Implementations 5 Keiko bytecode 6 See also 7 References 8 Further reading 9 External linksExample code editThe following Oberon 2 code implements a simple binary tree MODULE Trees TYPE Tree POINTER TO Node Node RECORD name POINTER TO ARRAY OF CHAR left right Tree END PROCEDURE t Tree Insert name ARRAY OF CHAR VAR p father Tree BEGIN p t REPEAT father p IF name p name THEN RETURN END IF name lt p name THEN p p left ELSE p p right END UNTIL p NIL NEW p p left NIL p right NIL NEW p name LEN name 1 COPY name p name IF name lt father name THEN father left p ELSE father right p END END Insert PROCEDURE t Tree Search name ARRAY OF CHAR Tree VAR p Tree BEGIN p t WHILE p NIL amp name p name DO IF name lt p name THEN p p left ELSE p p right END END RETURN p END Search PROCEDURE NewTree Tree VAR t Tree BEGIN NEW t NEW t name 1 t name 0 0 X t left NIL t right NIL RETURN t END NewTree END Trees Oberon 2 extensions to Oberon 3 editType bound procedures edit Procedures can be bound to a record or pointer type They are equivalent to instance methods in object oriented terminology Read only export edit The use of exported variables and record fields can be restricted to read only access This is shown with a visibility flag Open arrays edit Open arrays which formerly could only be declared as formal parameter types may now be declared as pointer base types FOR statement edit The FOR statement of Pascal and Modula 2 was not implemented in Oberon It is reintroduced in Oberon 2 Runtime type checking edit Oberon 2 provides several mechanisms for checking the dynamic type of an object For example where a Bird object might be instantiated to either a Duck or a Cuckoo Oberon 2 allows the programmer to respond to the actual type of the object at runtime The first most conventional approach is to rely on the type binding system The second approach is to use the WITH statement which allows the dynamic subtype of a variable to be checked directly In both cases once the subtype has been identified the programmer can make use of any type bound procedures or variables that are appropriate to the subtype Examples of these approaches are shown below Note that the form of WITH statement used in Oberon 2 is unrelated to the Pascal and Modula 2 WITH statement This method of abbreviating access to record fields is not implemented in Oberon or Oberon 2 Type binding edit MODULE Birds TYPE Bird RECORD sound ARRAY 10 OF CHAR END END Birds MODULE Ducks IMPORT Birds TYPE Duck RECORD Birds Bird END PROCEDURE SetSound VAR bird Duck BEGIN bird sound Quack END SetSound END Ducks MODULE Cuckoos IMPORT Birds TYPE Cuckoo RECORD Birds Bird END PROCEDURE SetSound VAR bird Cuckoo BEGIN bird sound Cuckoo END SetSound END Cuckoos WITH statement edit MODULE Test IMPORT Out Birds Cuckoos Ducks TYPE SomeBird RECORD Birds Bird END VAR sb SomeBird c Cuckoos Cuckoo d Ducks Duck PROCEDURE SetSound VAR bird Birds Bird BEGIN WITH bird Cuckoos Cuckoo DO bird sound Cuckoo bird Ducks Duck DO bird sound Quack ELSE bird sound Tweet END END SetSound PROCEDURE MakeSound VAR b Birds Bird BEGIN Out Ln Out String b sound Out Ln END MakeSound BEGIN SetSound c SetSound d SetSound sb MakeSound c MakeSound d MakeSound sb END Test POINTER edit MODULE PointerBirds IMPORT Out TYPE BirdRec RECORD sound ARRAY 10 OF CHAR END DuckRec RECORD BirdRec END CuckooRec RECORD BirdRec END Bird POINTER TO BirdRec Cuckoo POINTER TO CuckooRec Duck POINTER TO DuckRec VAR pb Bird pc Cuckoo pd Duck PROCEDURE SetDuckSound bird Duck BEGIN bird sound Quack END SetDuckSound PROCEDURE SetCuckooSound bird Cuckoo BEGIN bird sound Cuckoo END SetCuckooSound PROCEDURE SetSound bird Bird BEGIN WITH bird Cuckoo DO SetCuckooSound bird bird Duck DO SetDuckSound bird ELSE bird sound Tweet END END SetSound BEGIN NEW pc NEW pd SetCuckooSound pc SetDuckSound pd Out Ln Out String pc sound Out Ln Out Ln Out String pd sound Out Ln SetSound pc SetSound pd Out Ln Out String pc sound Out Ln Out Ln Out String pd sound Out Ln Pass dynamic type to procedure pb pd SetDuckSound pb Duck Out Ln Out String pb sound Out Ln pb pc SetCuckooSound pb Cuckoo Out Ln Out String pb sound Out Ln SetSound pb Out Ln Out String pb sound Out Ln pb pd SetSound pb Out Ln Out String pb sound Out Ln NEW pb SetSound pb Out Ln Out String pb sound Out Ln END PointerBirds IS operator edit A third approach is possible using the IS operator This is a relation operator with the same precedence as equals greater gt etc but which tests dynamic type Unlike the two other approaches however it does not allow the programmer access to the subtype that has been detected Syntax editThe development of the ALGOL Pascal Modula 2 Oberon Component Pascal language family is marked by a reduction in the complexity of the language syntax The entire Oberon 2 language is described Mossenbock amp Wirth March 1995 using only 33 grammatical productions in the extended Backus Naur form as shown below Module MODULE ident ImportList DeclSeq BEGIN StatementSeq END ident ImportList IMPORT ident ident ident ident DeclSeq CONST ConstDecl TYPE TypeDecl VAR VarDecl ProcDecl ForwardDecl ConstDecl IdentDef ConstExpr TypeDecl IdentDef Type VarDecl IdentList Type ProcDecl PROCEDURE Receiver IdentDef FormalPars DeclSeq BEGIN StatementSeq END ident ForwardDecl PROCEDURE Receiver IdentDef FormalPars FormalPars FPSection FPSection Qualident FPSection VAR ident ident Type Receiver VAR ident ident Type Qualident ARRAY ConstExpr ConstExpr OF Type RECORD Qualident FieldList FieldList END POINTER TO Type PROCEDURE FormalPars FieldList IdentList Type StatementSeq Statement Statement Statement Designator Expr Designator ExprList IF Expr THEN StatementSeq ELSIF Expr THEN StatementSeq ELSE StatementSeq END CASE Expr OF Case Case ELSE StatementSeq END WHILE Expr DO StatementSeq END REPEAT StatementSeq UNTIL Expr FOR ident Expr TO Expr BY ConstExpr DO StatementSeq END LOOP StatementSeq END WITH Guard DO StatementSeq Guard DO StatementSeq ELSE StatementSeq END EXIT RETURN Expr Case CaseLabels CaseLabels StatementSeq CaseLabels ConstExpr ConstExpr Guard Qualident Qualident ConstExpr Expr Expr SimpleExpr Relation SimpleExpr SimpleExpr Term AddOp Term Term Factor MulOp Factor Factor Designator ExprList number character string NIL Set Expr Factor Set Element Element Element Expr Expr Relation lt lt gt gt IN IS AddOp OR MulOp DIV MOD amp Designator Qualident ident ExprList Qualident ExprList Expr Expr IdentList IdentDef IdentDef Qualident ident ident IdentDef ident Implementations editOberon 2 compilers maintained by ETH include versions for Windows Linux Solaris macOS The Oxford Oberon 2 compiler compiles to native machine code and can use a JIT on Windows Linux and macOS It is created and maintained by Mike Spivey and uses the Keiko Virtual Machine 4 5 There is an Oberon 2 Lex scanner and Yacc parser by Stephen J Bevan of Manchester University UK based on the one in the Mossenbock and Wirth reference It is at version 1 4 There is a release named Native Oberon which includes an operating system and can directly boot on PC class hardware A NET implementation of Oberon with the addition of some minor NET related extensions has been developed at ETHZ Programmer s Open Workbench POW 6 is a very simple integrated development environment which is provided with editor linker and Oberon 2 compiler This compiles to Windows executables Full source code is provided the compiler is written in Oberon 2 The Java to Oberon Compiler JOB was written at the University of Vologda in Russia It produces object code in the form of Java class files bytecode Some JOB specific classes are provided which are Java compatible but which use a more Oberon like component hierarchy The Optimizing Oberon 2 Compiler compiles to C using the GNU Compiler Collection GCC toolchain for program generation Oberon Script is a compiler that translates the full Oberon language into JavaScript The compiler is written in JavaScript and can thus be called from Web pages to process scripts written in Oberon XDS Modula2 Oberon2 is a development system by Excelsior LLC Novosibirsk Russia It contains an optimizing compiler for Intel Pentium or via C translator for cross platform software development Available for Windows and Linux The compiler is written in Oberon 2 and compiles itself Oberon Revival is a project to bring Oberon 2 and Component Pascal BlackBox Component Builder to Linux and Win32 The Linux port of BlackBox was unavailable before and it originally ran on only Microsoft Windows XOberon is a real time operating system for PowerPC written in Oberon 2 The Portable Oberon 2 Compiler OP2 was developed to port the Oberon System onto commercially available platforms 7 Keiko bytecode editOberon 2 can target the Keiko Virtual machine 8 9 For example like some other language compilers see O code p code etc the Oxford Oberon 2 compiler first compiles to an intermediate bytecode Keiko bytecode which can be interpreted with a byte code interpreter or use just in time compilation See also editA2 operating system References edit Related Reading Dr Dobb s Pfister Cuno 2001 What s New in Component Pascal changes from Oberon 2 to CP PDF Oberon microsystems Archived from the original PDF on 15 May 2011 Retrieved 10 January 2007 Differences between Oberon and Oberon 2 Mossenbock and Wirth 1993 Spivey Michael 2014 Specification of Keiko Spivey s Corner Report Oriel College University of Oxford Archived from the original on 4 March 2016 Retrieved 9 July 2023 Spivey Michael 30 September 2020 Design overview for OBC The Keiko Abstract Machine Spivey s Corner Report Oriel College University of Oxford Retrieved 9 July 2023 The Oxford Oberon 2 compiler translates source programs into code for a stack based abstract machine the Keiko machine Collingbourne H February 2000 What Pascal s inventor did next PC Plus No 160 Crelier Regis 1994 Separate Compilation and Module Extension PhD ETH Zurich doi 10 3929 ethz a 000945227 hdl 20 500 11850 141604 Retrieved 18 November 2018 Dr Michael Spivey Specification of Keiko Dr Michael Spivey Design overview for OBC The Keiko Abstract Machine quote The Oxford Oberon 2 compiler translates source programs into code for a stack based abstract machine the Keiko machine Further reading edit nbsp Wikibooks has a book on the topic of Oberon Oberon Language Genealogy Tree maintained at ETHZ Second International Modula 2 Conference September 1991 From Modula to Oberon Wirth 1990 Programming in Oberon A derivative of Programming in Modula 2 Wirth 1982 The Programming Language Oberon Wirth 1990 Oberon 2 Report The Programming Language Oberon 2 H Mossenbock N Wirth Institut fur Computersysteme ETH Zurich January 1992 and Structured Programming 1991 12 4 179 195 Various references including electronic online versions Object Oriented Programming in Oberon 2 Hanspeter Mossenbock 1994 Available from Johannes Kepler University as PDF with the friendly permission of Springer Verlag Design Patterns in Oberon 2 and Component Pascal Project Oberon The design of an Operating System and Compiler Niklaus Wirth amp Jurg Gutknecht 2005 Project Oberon The design of an Operating System and Compiler Niklaus Wirth amp Jurg Gutknecht 2013 External links editOfficial website ETH Zurich Oberon Reference page at ETH Zurich Oberon at SSW Linz Pow Tutorial in Romanian language by Dan Popa ftp ftp inf ethz ch pub Oberon The Oberon 2 Reflection Model and its Applications Retrieved from https en wikipedia org w index php title Oberon 2 amp oldid 1218542990, wikipedia, wiki, book, books, library,

article

, read, download, free, free download, mp3, video, mp4, 3gp, jpg, jpeg, gif, png, picture, music, song, movie, book, game, games.