Oberon

Oberon是一種通用程式語言，最初由尼克勞斯·維爾特在1987年推出，是維爾特風格的類ALGOL語言中的最後一員。Oberon是增進Pascal的直接後繼者Modula-2的能力，並減少其複雜度的集中努力的結果。它的原理性新特徵是記錄型別的型別擴充套件的概念。它允許新資料型別構造在現存資料型別之上並關聯於它們，脫離了嚴格的靜態型別資料的教條。Oberon是在瑞士的蘇黎世聯邦理工學院作為實現的一部份而開發的。這個名字來自天王星的衛星奧伯隆。Oberon的當前版本是2007年修訂的Oberon-07，它仍由維爾特來維護而Oberon計劃編譯器仍在隨時更新。設計.Oberon的基本指導原則是集中於基礎和根本的特徵，並忽略短暫性的問題。另一個因素是認識到了在語言如C++和Ada中複雜度的增長。與它們相反，Oberon強調使用庫概念來擴充套件語言。在Modula-2中提供的列舉和子範圍型別被省略了；類似的集合型別被限制為小的整數集合，而低層設施的數量被大幅度縮減。省略餘下的潛在不安全設施，是得到真正的高階語言的最根本步驟。甚至跨越模組的非常緊密的型別檢查，嚴格的執行時間索引檢查，空指標檢查，和安全的型別擴充套件概念，在很大程度上允許程式設計單獨的依仗於語言規則。這種策略的意圖是產生易於學習、實現更簡單和高效的語言。Oberon編譯器被認為是簡明和快速的，卻提供了可比擬於商業編譯器的程式碼質量。特徵.刻畫Oberon語言的特徵包括：面向物件示例.Oberon支援對記錄型別的擴充套件，用於抽象和異構結構的構造。不同於後期方言即1991年提出的和1998年提出的，最初的Oberon缺乏作為語言特徵的分派機制，而是把它作為一種程式設計技術或設計模式。這給出了在OOP上的巨大靈活性。在中，兩種技術被一起用於分派呼叫：方法套件和訊息處理器。方法套件.在這種技術中，泛化模組定義過程變數的一個表格型別，而擴充套件模組中宣告這個型別的一個共享變數，泛化模組中的方法要訪問這個表格的對應專案，而擴充套件模組將這個表格的專案指派到自己相應的過程：MODULE Figures; (* 抽象模組 *)TYPEFigure* = POINTER TO FigureDesc;Interface* = POINTER TO InterfaceDesc;InterfaceDesc* = RECORDdraw* : PROCEDURE (f : Figure);clear* : PROCEDURE (f : Figure);mark* : PROCEDURE (f : Figure);move* : PROCEDURE (f : Figure; dx, dy : INTEGER);END;FigureDesc* = RECORDif : Interface;END;PROCEDURE Init* (f : Figure; if : Interface);BEGINf.if := if;END Init;PROCEDURE Draw* (f : Figure);BEGINf.if.draw(f);END Draw;END Figures.擴充套件泛化型別codice_1為特定形狀codice_2：MODULE Rectangles;IMPORT Figures;TYPERectangle* = POINTER TO RectangleDesc;RectangleDesc* = RECORD(Figures.FigureDesc)x, y, w, h : INTEGER;END;VARif : Figures.Interface;PROCEDURE New* (VAR r : Rectangle);BEGINNEW(r);Figures.Init(r, if);END New;PROCEDURE Draw* (f : Figure);VARr : Rectangle;BEGINr := f(Rectangle); (* f具有Rectangle型別 *)END Draw;BEGIN (* 模組初始化 *)NEW(if);if.draw := Draw;if.clear := Clear;if.mark := Mark;if.move := Move;END Rectangles.動態分派只能透過泛化模組的codice_3中的方法集合完成，比如這裡的codice_4、codice_5、codice_6和codice_7過程，它們透過介面表格呼叫了擴充套件模組codice_2中的同名過程。訊息處理器.這種技術形成於，在泛化模組中定義一個單一的處理器過程型別，並在擴充套件模組中宣告這個型別的一個過程，用它處理對應各種方法幷包含了相應的實際引數的訊息記錄：MODULE Figures; (* 抽象模組 *)TYPEFigure* = 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);BEGINf.handle(f, msg);END Handle;PROCEDURE Init* (f : Figure; handle : Handler);BEGINf.handle := handle;END Init;END Figures.擴充套件泛化型別codice_1為特定形狀codice_2：MODULE Rectangles;IMPORT Figures;TYPERectangle* = POINTER TO RectangleDesc;RectangleDesc* = RECORD (Figures.FigureDesc)x, y, w, h : INTEGER;END;PROCEDURE Draw* (r : Rectangle);BEGINEND Draw;(* 這裡是其他過程Clear、Mark和Move *)PROCEDURE Handle* (f: Figure; VAR msg: Figures.Message);VARr : Rectangle;BEGINr := f(Rectangle);IF msg IS Figures.DrawMsg THEN Draw(r)ELSIF msg IS Figures.MarkMsg THEN Mark(r)ELSIF msg IS Figures.MoveMsg THENMove(r, msg(Figures.MoveMsg).dx, msg(Figures.MoveMsg).dy)ELSE (* 忽略 *)ENDEND Handle;PROCEDURE New* (VAR r : Rectangle);BEGINNEW(r);Figures.Init(r, Handle);END New;END Rectangles.在Oberon作業系統中，這兩種技術都用於動態分派。前者用於已知的方法集合；後者用於在擴充套件模組中宣告的任何新方法。例如，如果擴充套件模組codice_2要實現一個新的codice_12過程，在擴充套件模組之外只能透過它的訊息處理器過程來呼叫。外部資源連結.一般性.Oberon的演化.