歐洲民間傳說的妖精王，請見「**奧伯隆**」。

**Oberon**是一种通用编程语言，最初由尼克劳斯·维尔特在1987年推出，是维尔特风格的类ALGOL语言中的最后一员（继Euler（英语：）、ALGOL W、Pascal、Modula和Modula-2之后）。Oberon是增进Pascal的直接后继者Modula-2的能力，并减少其复杂度的集中努力的结果。它的原理性新特征是记录类型的类型扩展的概念。它允许新数据类型构造在现存数据类型之上并关联于它们，脱离了严格的静态类型数据的教条。Oberon是在瑞士的苏黎世联邦理工学院作为Oberon操作系统（英语：）实现的一部份而开发的。这个名字来自天王星的卫星奧伯隆。

Oberon的当前版本是2007年修订的Oberon-07，它仍由维尔特来维护而Oberon计划编译器仍在随时更新。

设计
--

Oberon的基本指导原则是集中于基础和根本的特征，并忽略短暂性的问题。另一个因素是认识到了在语言如C++和Ada中复杂度的增长。与它们相反，Oberon强调使用库概念来扩展语言。在Modula-2中提供的枚举和子范围类型被省略了；类似的集合类型被限制为小的整数集合，而低层设施的数量被大幅度缩减（特别是省略了类型转移函数）。省略余下的潜在不安全设施，是得到真正的高级语言的最根本步骤。甚至跨越模块的非常紧密的类型检查，严格的运行时间索引检查，空指针检查，和安全的类型扩展概念，在很大程度上允许编程单独的依仗于语言规则。

这种策略的意图是产生易于学习、实现更简单和高效的语言。Oberon编译器被认为是简明和快速的，却提供了可比拟于商业编译器的代码质量。

特征
--

Oberon的曾用标志
刻画Oberon语言的特征包括：

* 具有大写关键字的大小写敏感语法。
* 具有类型测试的类型扩展。
* 模块和分离编译。
* 字符串操作。
* 孤立不安全代码。
* 支持系统编程。

面向对象示例
------

Oberon支持对记录类型的扩展，用于抽象和异构结构的构造。不同于后期方言即1991年提出的Oberon-2（英语：）和1998年提出的Active Oberon（英语：），最初的Oberon缺乏作为语言特征的分派机制，而是把它作为一种编程技术或设计模式。这给出了在OOP上的巨大灵活性。在Oberon操作系统（英语：）中，两种技术被一起用于分派调用：方法套件和消息处理器。

### 方法套件

在这种技术中，泛化模块定义过程变量的一个表格类型，而扩展模块中声明这个类型的一个共享变量，泛化模块中的方法要访问这个表格的对应项目，而扩展模块将这个表格的项目指派到自己相应的过程：

```
MODULE Figures; (\* 抽象模块 \*)

  TYPE
    Figure\* = POINTER TO FigureDesc;
    Interface\* = POINTER TO InterfaceDesc;
 
    InterfaceDesc\* = RECORD
      draw\* : PROCEDURE (f : Figure);
      clear\* : PROCEDURE (f : Figure);
      mark\* : PROCEDURE (f : Figure);
      move\* : PROCEDURE (f : Figure; dx, dy : INTEGER);
    END;
 
    FigureDesc\* = RECORD
      if : Interface;
    END;
 
  PROCEDURE Init\* (f : Figure; if : Interface);
  BEGIN
    f.if := if;
  END Init;
 
  PROCEDURE Draw\* (f : Figure);
  BEGIN
    f.if.draw(f);
  END Draw;
 
(\* 这里是其他过程Clear、Mark和Move \*)
 
END Figures.

```

扩展泛化类型`Figure`为特定形状`Rectangles`：

```
MODULE Rectangles;
 
  IMPORT Figures;
 
  TYPE
    Rectangle\* = POINTER TO RectangleDesc;
 
    RectangleDesc\* = RECORD
      (Figures.FigureDesc)
      x, y, w, h : INTEGER;
    END;
 
  VAR
    if : Figures.Interface;
 
  PROCEDURE New\* (VAR r : Rectangle);
  BEGIN
    NEW(r);
    Figures.Init(r, if);
  END New;
 
  PROCEDURE Draw\* (f : Figure);
    VAR
      r : Rectangle;
  BEGIN
    r := f(Rectangle); (\* f具有Rectangle类型 \*)
    (\* ... \*)
  END Draw;
 
(\* 这里是其他过程Clear、Mark和Move \*)
 
BEGIN (\* 模块初始化 \*)
  NEW(if);
  if.draw := Draw;
  if.clear := Clear;
  if.mark := Mark;
  if.move := Move;
END Rectangles.

```

动态分派只能通过泛化模块的`Figures`中的方法集合完成，比如这里的`Draw`、`Clear`、`Mark`和`Move`过程，它们通过接口表格调用了扩展模块`Rectangles`中的同名过程。

### 消息处理器

这种技术形成于，在泛化模块中定义一个单一的处理器过程类型，并在扩展模块中声明这个类型的一个过程，用它处理对应各种方法并包含了相应的实际参数的消息记录：

```
MODULE Figures; (\* 抽象模块 \*)
 
  TYPE
    Figure\* = POINTER TO FigureDesc;
 
    Message\* = RECORD END;
    DrawMsg\* = RECORD (Message) END;
    ClearMsg\* = RECORD (Message) END;
    MarkMsg\* = RECORD (Message) END;
    MoveMsg\* = RECORD (Message) dx\*, dy\* : INTEGER END;
 
    Handler\* = PROCEDURE (f : Figure; VAR msg : Message);
 
    FigureDesc\* = RECORD
      (\* 抽象 \*)
      handle : Handler;
    END;
 
  PROCEDURE Handle\* (f : Figure; VAR msg : Message);
  BEGIN
    f.handle(f, msg);
  END Handle;
 
  PROCEDURE Init\* (f : Figure; handle : Handler);
  BEGIN
    f.handle := handle;
  END Init;
 
END Figures.

```

扩展泛化类型`Figure`为特定形状`Rectangles`：

```
MODULE Rectangles;
 
  IMPORT Figures;
 
  TYPE
    Rectangle\* = POINTER TO RectangleDesc;
 
    RectangleDesc\* = RECORD (Figures.FigureDesc)
      x, y, w, h : INTEGER;
    END;
 
  PROCEDURE Draw\* (r : Rectangle);
  BEGIN
    (\* ... \*)
  END Draw;
 
  (\* 这里是其他过程Clear、Mark和Move \*)
 
  PROCEDURE Handle\* (f: Figure; VAR msg: Figures.Message);
    VAR
      r : Rectangle;
  BEGIN
    r := f(Rectangle);
    IF msg IS Figures.DrawMsg THEN Draw(r)
    ELSIF msg IS Figures.MarkMsg THEN Mark(r)
    ELSIF msg IS Figures.MoveMsg THEN 
      Move(r, msg(Figures.MoveMsg).dx, msg(Figures.MoveMsg).dy)
    ELSE (\* 忽略 \*)
    END
  END Handle;
 
  PROCEDURE New\* (VAR r : Rectangle);
  BEGIN
    NEW(r);
    Figures.Init(r, Handle);
  END New;
 
END Rectangles.

```

在Oberon操作系统中，这两种技术都用于动态分派。前者用于已知的方法集合；后者用于在扩展模块中声明的任何新方法。例如，如果扩展模块`Rectangles`要实现一个新的`Rotate()`过程，在扩展模块之外只能通过它的消息处理器过程来调用。

参见
--

* Oberon (操作系统)（英语：）

引用
--

1. ↑  Wirth, Niklaus.  (报告). ETH Technical Reports D-INFK. Band 82. Wiley.  [2021-06-18]. （原始内容存档于2021-12-17）.
2. ↑  Wirth, Niklaus.. Software: Practice and Experience. July 1988, **18** (7): 661–670.
3. ↑  Wirth, Niklaus.. Software: Practice and Experience. July 1988, **18** (7): 671–690.
4. ↑  Wirth, Niklaus.. ACM Transactions on Programming Languages. April 1988, **10** (2): 204–214.
5. ↑  Pountain, D. March 1991.. Byte（英语：）. Vol. 16 no. 3: 135–142.
6. ↑  Wirth, Niklaus.. ETH Zurich.  [16 January 2021]. （原始内容存档于2019-04-07）.
7. ↑  Mössenböck, Hanspeter.  (PDF). Johannes Kepler University. []
8. ↑  Niklaus Wirth; Jürg Gutknecht（英语：）.. 1987–2021  [2021-06-18]. （原始内容存档于2021-07-19）.

外部资源链接
------

### 一般性

* Official website (latest available copy at archive org) at ETH-Zürich
* Niklaus Wirth's Oberon Page （页面存档备份，存于） at ETH-Zürich
* Oberon Page （页面存档备份，存于） at SSW, Linz
* Oberon: The Programming Language （页面存档备份，存于） at Ulm
* Project Oberon, The Design of an Operating System and a Compiler （页面存档备份，存于）, book in PDF by Niklaus Wirth and Jürg Gutknecht, 2005 Edition
* Oberon Language Genealogy
* Astrobe （页面存档备份，存于） ARM Oberon-07 Development System
* Oberon System V4 for HP OpenVMS Alpha with source code upward-compatible 64 bit addressing
* 64 bit Oberon-2 compiler for HP OpenVMS Alpha
* Oxford Oberon-2 Compiler （页面存档备份，存于） and its User Manual[]
* Free Oberon-07 IDE （页面存档备份，存于） Free Oberon-07 IDE for Windows, Macintosh, and Linux with syntax colouring, semantic navigation and source code debugger
* Oberon article by Joseph Templ （页面存档备份，存于） in the January 1994 issue of Dr.Dobbs

### Oberon的演化

* Modula-2 and Oberon （页面存档备份，存于） Wirth (2005)
* The Programming Language Oberon （页面存档备份，存于） Wirth, (1988/90)
* The Programming Language Oberon (Oberon-7, Revised Oberon) （页面存档备份，存于） Wirth, (2016, most current language report)
* Differences between Oberon-07 and Oberon （页面存档备份，存于） Wirth (2011)
* The Programming Language Oberon-2[] H. Mössenböck, N. Wirth, Institut für Computersysteme, ETH Zürich, January 1992
* Differences between Oberon and Oberon-2[] Mössenböck and Wirth (1991)
* What's New in Component Pascal (Changes from Oberon-2 to CP), Pfister (2001)



|  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- |
| 

| * 
* 论
* 编
程序设计语言 |
| --- |
|  |
| 按范型 | 

|  |  |
| --- | --- |
| 过程式 | 
* FORTRAN
* COBOL
* JOVIAL
* ALGOL 60
* JOSS（英语：）
* BASIC
	+ QB64（英语：）
* PL/I
* MUMPS（英语：）
* ALGOL 68
* Forth
* Pascal
	+ Turbo Pascal
* C
* Modula-2
* Ada 83
* occam
* Oberon
* Go
* Zig

 |
|  |
| 面向对象 | 
* Simula 67
* Smalltalk
* Objective-C
* Eiffel
* Object Pascal
	+ Delphi
* Self
* Visual Basic
	+ Gambas
* Ada 95
* Java
* C#
	+ Vala
* Fantom（英语：）
* Crystal（英语：）

 |
|  |
| 多范型 | 
* C++
* Modula-3
* Dylan
* Python
* Lua
* JavaScript
* Ruby
* D
* Factor
* Scala
* F#
	+ F\*
* Haxe
* Dafny（英语：）
* Nim
* Rust
* Dart
* Julia
* Swift
* Bosque（英语：）

 |
|  |
| 函数式 | 

|  |
| --- |
| 
* LISP
	+ Scheme
	+ Common Lisp
	+ Clojure
* Logo
* APL/J
* ML
	+ Standard ML
	+ OCaml
* Erlang
	+ Elixir
* Haskell
	+ Curry
* SAC
* Agda
* Idris
* Pure（英语：）
* jq（英语：）
* Cuneiform

 |

 |
|  |
| 逻辑式 | 
* Prolog
* Datalog
* Mercury
* AnsProlog

 |

 |
|  |
| 脚本语言 | 

|  |  |
| --- | --- |
| 动态语言 | 
* SNOBOL
* Icon
* REXX
* Perl
	+ Raku
* Tcl/Tk
* CLOS
* newLISP
* Python
* Lua
* Ruby
* PHP
	+ Hack
* CFML（英语：）
* REBOL
	+ Red（英语：）
* Julia

 |
|  |
| Shell语言 | 
* Unix shell
	+ sh/ash
	+ csh/tcsh
	+ ksh
	+ bash
	+ zsh
	+ rc（英语：）
	+ fish
* sed
* AWK
* PowerShell

 |
|  |
| ECMA-262 | 
* ECMAScript
	+ JavaScript
* TypeScript
* Node.js/Deno
* CoffeeScript/LiveScript（英语：）
* Elm
* PureScript
* Reason

 |

 |
|  |
| 特定平台 | 

|  |  |
| --- | --- |
| .NET | 
* C#
* C++/CLI
* F#
* PowerShell
* VB.NET
* Small Basic

 |
|  |
| JVM | 
* Java
	+ AspectJ（英语：）
* Scala
* Clojure
* Groovy
* Kotlin

 |

 |
|  |
| 特定领域 | 

|  |  |
| --- | --- |
| 科学计算 | 
* Speakeasy（英语：）
* IDL
	+ GDL
* Maxima
* Maple
* MATLAB
	+ Octave
	+ Scilab
* Wolfram
* R
* Yorick（英语：）
* SageMath
* Julia

 |
|  |
| GPU计算 | 
* GLSL
* HLSL
* BrookGPU（英语：）
* OpenCL
* CUDA
* Futhark
* Vulkan

 |
|  |
| 数据查询 | 
* SQL
	+ PL/SQL
	+ T-SQL
	+ SQL/PSM（英语：）
* xBase（英语：）
* XPath
* XQuery（英语：）
* GraphQL

 |
|  |
| 可视化 | 
* Simulink
* LabVIEW
* Orange（英语：）
* KNIME（英语：）
* Scratch
	+ Snap!
* Power Fx

 |
|  |
| 传媒设计 | 
* SuperCollider
* Pure Data
* Processing
* ChucK

 |

 |
|  |
| 其它 | 
* 汇编语言
* APT（英语：）
* GPSS（英语：）
* dc
* make
* PostScript
* XSLT
* WebAssembly

 |
|  |
| 
* 分类 目录
* 列表级条目 列表
* 历史
* 比较（英语：）
* 时间线（英语：）

 |

 |

|  |  |  |
| --- | --- | --- |
| 

|  |  |
| --- | --- |
| 规范控制 編輯維基數據鏈接 | 
* GND: 4248282-3

 |

 |