Oberon

维基百科,自由的百科全书
跳到导航 跳到搜索
Oberon
Oberon programming language logo.svg
编程范型指令式, 结构化, 模块化, 面向对象
语言家族Wirth Oberon
設計者Niklaus Wirth
實作者ETH Zurich
发行时间1987年,​34年前​(1987
穩定版本
Oberon-07
(2020年3月6日,​20個月前​(2020-03-06
型態系統强类型, 混合(静态动态)
作用域词法
系统平台ARM, StrongARM; IA-32, x86-64; SPARC, Ceres英语Ceres (workstation) (NS32032英语NS32000)
作業系統Windows, Linux, Solaris, classic Mac OS, Atari TOS英语Atari TOS, AmigaOS
網站www.projectoberon.com
啟發語言
Modula-2
影響語言
Oberon-2英语Oberon-2, Oberon-07, Zonnon英语Zonnon, Go, Nim, Active Oberon英语Active Oberon, Component Pascal英语Component Pascal

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

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

设计[编辑]

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

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

特征[编辑]

Oberon的曾用标志

刻画Oberon语言的特征包括[8]

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

面向对象[编辑]

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;
 
(* 这里是其他过程 *)
 
END Figures.

扩展泛化类型Figure为特定形状:

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;
 
(* 这里是其他过程 *)
 
BEGIN (* 模块初始化 *)
  NEW(if);
  if.draw  := Draw;
  if.clear := Clear;
  if.mark  := Mark;
  if.move  := Move;
END Rectangles.

动态分派只能通过在是为泛化模块的Figures模块中的过程来完成。

消息处理器[编辑]

这种技术形成自将方法的集合替代为一个单一的过程,由它来区分各种方法:

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为特定形状:

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;
 
  (* 这里是其他过程 *)
 
  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()过程,在Figures模块中只能通过消息处理器来调用。

参见[编辑]

资源[编辑]

一般性[编辑]

Oberon的演化[编辑]

引用[编辑]

  1. ^ Wirth, Niklaus. From Modula to Oberon and the programming language Oberon. ETH Technical Reports D-INFK. Wiley. 
  2. ^ Wirth, Niklaus. The Programming Language Oberon. Software: Practice and Experience. July 1988, 18 (7): 661–670. 
  3. ^ Wirth, Niklaus. From Modula to Oberon. Software: Practice and Experience. July 1988: 671–690. 
  4. ^ Wirth, Niklaus. Type Extensions. ACM Transactions on Programming Languages. April 1988, 10 (2): 204–214. 
  5. ^ Pountain, D. March 1991. Modula's Children, Part II: Oberon. Byte. Vol. 16 no. 3: 135–142. 
  6. ^ Wirth, Niklaus. Oberon Change Log. ETH Zurich. [16 January 2021]. 
  7. ^ Mössenböck, Hanspeter. Compiler Construction: The Art of Niklaus Wirth (PDF). Johannes Kepler University. 
  8. ^ Wirth, Niklaus; Gutknecht, Jürg. Project Oberon. 1987–2021.