![]() | |
编程范型 | 指令式,结构化,模块化,面向对象 |
---|---|
语言家族 | Wirth Oberon |
設計者 | Niklaus Wirth |
實作者 | 苏黎世联邦理工学院 |
发行时间 | 1987年,38年前(1987) |
型態系統 | 强类型, 混合(静态和动态) |
作用域 | 词法 |
系统平台 | ARM,StrongARM;IA-32,x86-64;SPARC,Ceres(英语:Ceres (workstation)) (NS32032(英语:NS32000)) |
操作系统 | Windows,Linux,Solaris,classic Mac OS,Atari TOS,AmigaOS |
網站 | www |
受影响于 | |
Modula-2 | |
影響語言 | |
Modula-3,Oberon-2(英语:Oberon-2),Component Pascal(英语:Component Pascal),Active Oberon(英语:Active Oberon), Oberon-07,Nim,Go,Zonnon(英语:Zonnon) |
Oberon是一种通用编程语言,最初由尼克劳斯·维尔特在1987年推出,是维尔特风格的类ALGOL语言中的最后一员(继Euler(英语:Euler (programming language))、ALGOL W、Pascal、Modula和Modula-2之后)[1][2][3][4]。Oberon是增进Pascal的直接后继者Modula-2的能力,并减少其复杂度的集中努力的结果。它的原理性新特征是记录类型的数据类型扩展的概念[5]。它允许新数据类型构造在现存数据类型之上并将它们关联起来,脱离了严格的静态类型数据的教条。Oberon是在瑞士的苏黎世联邦理工学院作为Oberon操作系统(英语:Oberon (operating system))实现的一部份而开发的。这个名字来自天王星的卫星奧伯隆。
Oberon的当前版本是2007年修订的Oberon-07,它由维尔特来维护而Oberon计划编译器最近更新于2020年3月6日[6]。
Oberon的基本指导原则是集中于基础和根本的特征,并忽略短暂性的问题。另一个因素是认识到了在语言如C++和Ada中复杂度的增长。与它们相反,Oberon强调使用库概念来扩展语言。在Modula-2中提供的枚举和子范围类型被省略了,并且集合类型被限制为小的整数集合。所有的导入项目都必须用它们在其中声明的那个模块的名字来限定。通过只允许低层设施在包含了标识符SYSTEM
于其导入列表的模块中使用而突显了它们。甚至跨越模块的非常严格的类型检查、运行时间索引检查、空指针检查和安全的类型扩展概念,在很大程度上允许编程单独的依仗于语言规则。
这种策略的意图是产生易于学习、实现更简单和高效的语言。Oberon编译器被认为是简明和快速的,却提供了可比拟于商业编译器的代码质量[7]。
刻画Oberon语言的特征包括[8]:
Oberon支持对记录类型的扩展,用于抽象和异构结构的构造。不同于后期方言即1991年提出的Oberon-2(英语:Oberon-2)和1998年提出的Active Oberon(英语:Active Oberon),最初的Oberon缺乏作为语言特征的分派机制,而是把它作为一种编程技术或设计模式。这给出了在OOP上的巨大灵活性。在Oberon操作系统(英语:Oberon (operating system))中,两种技术被一起用于分派调用:方法套件和消息处理器。
在这种技术中,泛化模块定义过程变量的一个表格类型,而扩展模块中声明这个类型的一个共享变量,泛化模块中的方法要访问这个表格的对应项目,而扩展模块将这个表格的项目指派到自己相应的过程:
MODULEFigures;(* 抽象模块 *)TYPEFigure*=POINTERTOFigureDesc;Interface*=POINTERTOInterfaceDesc;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;PROCEDUREInit*(f:Figure;if:Interface);BEGINf.if:=if;ENDInit;PROCEDUREDraw*(f:Figure);BEGINf.if.draw(f);ENDDraw;(* 这里是其他过程Clear、Mark和Move *)ENDFigures.
扩展泛化类型Figure
为特定形状Rectangles
:
MODULERectangles;IMPORTFigures;TYPERectangle*=POINTERTORectangleDesc;RectangleDesc*=RECORD(Figures.FigureDesc)x,y,w,h:INTEGER;END;VARif:Figures.Interface;PROCEDURENew*(VARr:Rectangle);BEGINNEW(r);Figures.Init(r,if);ENDNew;PROCEDUREDraw*(f:Figure);VARr:Rectangle;BEGINr:=f(Rectangle);(* f具有Rectangle类型 *)(* ... *)ENDDraw;(* 这里是其他过程Clear、Mark和Move *)BEGIN(* 模块初始化 *)NEW(if);if.draw:=Draw;if.clear:=Clear;if.mark:=Mark;if.move:=Move;ENDRectangles.
动态分派只能通过泛化模块的Figures
中的方法集合完成,比如这里的Draw
、Clear
、Mark
和Move
过程,它们通过接口表格调用了扩展模块Rectangles
中的同名过程。
这种技术形成于,在泛化模块中定义一个单一的处理器过程类型,并在扩展模块中声明这个类型的一个过程,用它处理对应各种方法并包含了相应的实际参数的消息记录:
MODULEFigures;(* 抽象模块 *)TYPEFigure*=POINTERTOFigureDesc;Message*=RECORDEND;DrawMsg*=RECORD(Message)END;ClearMsg*=RECORD(Message)END;MarkMsg*=RECORD(Message)END;MoveMsg*=RECORD(Message)dx*,dy*:INTEGEREND;Handler*=PROCEDURE(f:Figure;VARmsg:Message);FigureDesc*=RECORD(* 抽象 *)handle:Handler;END;PROCEDUREHandle*(f:Figure;VARmsg:Message);BEGINf.handle(f,msg);ENDHandle;PROCEDUREInit*(f:Figure;handle:Handler);BEGINf.handle:=handle;ENDInit;ENDFigures.
扩展泛化类型Figure
为特定形状Rectangles
:
MODULERectangles;IMPORTFigures;TYPERectangle*=POINTERTORectangleDesc;RectangleDesc*=RECORD(Figures.FigureDesc)x,y,w,h:INTEGER;END;PROCEDUREDraw*(r:Rectangle);BEGIN(* ... *)ENDDraw;(* 这里是其他过程Clear、Mark和Move *)PROCEDUREHandle*(f:Figure;VARmsg:Figures.Message);VARr:Rectangle;BEGINr:=f(Rectangle);IFmsgISFigures.DrawMsgTHENDraw(r)ELSIFmsgISFigures.MarkMsgTHENMark(r)ELSIFmsgISFigures.MoveMsgTHENMove(r,msg(Figures.MoveMsg).dx,msg(Figures.MoveMsg).dy)ELSE(* 忽略 *)ENDENDHandle;PROCEDURENew*(VARr:Rectangle);BEGINNEW(r);Figures.Init(r,Handle);ENDNew;ENDRectangles.
在Oberon操作系统中,这两种技术都用于动态分派。前者用于已知的方法集合;后者用于在扩展模块中声明的任何新方法。例如,如果扩展模块Rectangles
要实现一个新的Rotate()
过程,在扩展模块之外只能通过它的消息处理器过程来调用。