Oberon

✍ dations ◷ 2025-07-20 00:58:22 #Oberon

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

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

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

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

刻画Oberon语言的特征包括:

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

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

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中的方法集合完成,比如这里的DrawClearMarkMove过程,它们通过接口表格调用了扩展模块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()过程,在扩展模块之外只能通过它的消息处理器过程来调用。

相关