从工作站系统问题出发

Oberon由尼克劳斯·维尔特与于尔格·古特克内希特在苏黎世联邦理工学院的工作站系统项目中发展。两人1985年在施乐帕洛阿尔托研究中心接触Cedar环境,既看重交互式工作站的能力,也感到庞大系统难以整体理解。他们希望做出规模可控、能够完整说明并用于教学的系统。

项目在1985年末开始设计,1986年初进入编程。团队起初准备使用Modula-2,但需要在既有模块之外扩充新的数据类型,并支持可靠的自动存储管理。维尔特负责语言与编译器设计,古特克内希特参与系统构思与实现;对实际软件的共同要求促使他们形成了同名的新语言。

参考:[1] [3]

减少特性,同时增加扩展能力

Oberon沿用过程式编程、静态类型和模块组织,但对Modula-2进行了取舍。语言删去了变体记录、枚举类型和子界类型等设施,将数组下界统一为零。设计者希望用较少的规则表达实际需要的程序,减轻编译器和学习者处理特殊情况的负担。

新增的核心机制是类型扩展:新记录可以在旧记录的字段之外增加内容,形成明确的基础类型与扩展类型关系。程序由此可以保留通用部分,再针对新对象增加信息。类型检查、类型测试和适当的运行时检查共同支持这种扩展,而不必靠任意解释内存中的位模式来实现。

参考:[2] [3]

窗口类型怎样容纳新的内容

维尔特的论文以窗口说明类型扩展。基础窗口记录保存横纵坐标、宽和高;文本窗口在这些字段之外再增加文本对象。处理位置或大小的通用代码仍然可以面对基础窗口,而文本处理代码则使用扩展后的信息。

若一个指针声明为指向基础记录,它可以指向符合扩展关系的记录对象。程序需要读取扩展字段时,先检查实际对象的类型,再按相应类型处理。这样的组织适用于混合存放不同种类窗口的结构,使公共管理逻辑与某种窗口专有的数据相互分开。

早期Oberon还可以把过程值放进记录字段,用来指定绘制等行为。对象的共同字段、额外数据和处理过程因此能够组合起来。后来Oberon-2把绑定到类型的过程进一步纳入语言,这属于后续扩展,并非原始Oberon已经具备同一套方法声明语法。

参考:[2] [3]

1987年的自足原型

最初的交叉编译器在Lilith工作站上用Modula-2编写,为采用NS32032处理器的Ceres生成代码。随后编译器本身被转写为Oberon。维尔特与古特克内希特的项目书记载,到1987年中,编译器和文本编辑功能已经能在目标机器上使用,开发不再必须依赖Lilith,系统草型由此独立运行。

语言在这里既是研究对象,也是继续构建系统的工具。存储、文件、显示和文本等模块在同一编程环境中组织,开发者可以用自己的编译器处理后续程序。1987年的这一阶段对应原型形成;此后面向更多用户的推广、网络和服务功能完善仍继续进行。

参考:[1]

按需加载的系统组织

在成熟的Oberon系统中,模块是分别编译和装入的单位。某个命令需要尚未驻留的模块时,系统把它及所依赖的模块装入,再把导入关系连接起来。文档里没有图形对象时,可以不装载整套图形编辑功能;出现图形内容后,再加入相应处理模块。

语言的类型扩展与这种系统扩展互相配合。例如,新图形框可以保留基本显示框的公共属性,再增加自身需要的数据,而继续利用原有的窗口管理。自动回收不可达存储则由系统运行机制提供。语言定义描述可用的类型和操作,具体加载与存储回收算法属于系统实现。

参考:[1] [3]

定义、教材与后续分支

1988年,维尔特关于Oberon语言的论文发表于《Software: Practice and Experience》。1992年的语言报告和《Project Oberon》等书籍进一步公开了语言规则、编译器和系统结构,让读者可以从接口到实现代码追踪其工作方式。后者所展示的是完整系统实例,而不只是操作系统原则的概述。

随着使用经验积累,Oberon-2等扩展和不同硬件上的实现相继出现。原始项目留下的主要方法是把可理解的语言、明确的模块边界和可扩展的数据组织共同用于系统建设。不同版本在类型、过程和模块规则上有所调整,1980年代原型的形成与这些后续发展构成不同层次。

参考:[1] [2] [3]