Oberon

Oberon 是一種通用程式語言，最初由尼克勞斯・維爾特在 1987 年推出，是維爾特風格的類 ALGOL 語言中的最後一員（繼、ALGOL W、Pascal、Modula 和 Modula-2 之後）。Oberon 是增進 Pascal 的直接後繼者 Modula-2 的能力，並減少其複雜度的集中努力的結果。它的原理性新特徵是記錄型別的資料型別擴充套件的概念。它允許新資料型別構造在現存資料型別之上並將它們關聯起來，脫離了嚴格的靜態型別資料的教條。Oberon 是在瑞士的蘇黎世聯邦理工學院作為實現的一部份而開發的。這個名字來自天王星的衛星奧伯隆。

Oberon 的當前版本是 2007 年修訂的 Oberon-07，它由維爾特來維護而 Oberon 計劃編譯器最近更新於 2020 年 3 月 6 日。

設計

Oberon 的基本指導原則是集中於基礎和根本的特徵，並忽略短暫性的問題。另一個因素是認識到了在語言如 C++ 和 Ada 中複雜度的增長。與它們相反，Oberon 強調使用庫概念來擴充套件語言。在 Modula-2 中提供的列舉和子範圍型別被省略了，並且集合型別被限制為小的整數集合。所有的匯入專案都必須用它們在其中宣告的那個模組的名字來限定。透過只允許低層設施在包含了識別符號 SYSTEM 於其匯入列表的模組中使用而突顯了它們。甚至跨越模組的非常嚴格的型別檢查、執行時間索引檢查、空指標檢查和安全的型別擴充套件概念，在很大程度上允許程式設計單獨的依仗於語言規則。

這種策略的意圖是產生易於學習、實現更簡單和高效的語言。Oberon 編譯器被認為是簡明和快速的，卻提供了可比擬於商業編譯器的程式碼質量。

特徵

刻畫 Oberon 語言的特徵包括：

具有大寫關鍵字的大小寫敏感語法。
具有型別測試的型別擴充套件。
模組和分離編譯。
字串操作。
孤立不安全程式碼。
支援系統程式設計。

面向物件示例

Oberon 支援對記錄型別的擴充套件，用於抽象和異構結構的構造。不同於後期方言即 1991 年提出的和 1998 年提出的，最初的 Oberon 缺乏作為語言特徵的分派機制，而是把它作為一種程式設計技術或設計模式。這給出了在 OOP 上的巨大靈活性。在中，兩種技術被一起用於分派呼叫：方法套件和訊息處理器。

3.1 方法套件

在這種技術中，泛化模組定義過程變數的一個表格型別，而擴充套件模組中宣告這個型別的一個共享變數，泛化模組中的方法要訪問這個表格的對應專案，而擴充套件模組將這個表格的專案指派到自己相應的過程：

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 中的同名過程。

3.2 訊息處理器

這種技術形成於，在泛化模組中定義一個單一的處理器過程型別，並在擴充套件模組中宣告這個型別的一個過程，用它處理對應各種方法幷包含了相應的實際引數的訊息記錄：

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 過程，在擴充套件模組之外只能透過它的訊息處理器過程來呼叫。