能够取得的实现

1989年11月17日,米克·乔丹发布Olivetti的Modula-3发行公告,说明当时已有可供alpha测试的限量版。用户须提交签署的许可协议,软件本身免费;公告中12月上旬的完整beta版仍是预定安排。这里的发布对象是一套编程环境,包括编译器和配套工具,而不只是语言说明书。

另一条路线来自数字设备公司(DEC)的系统研究中心(SRC)。开发者比尔·卡尔索在2021年回顾中,把SRC系统的首次公开发行明确记为1989年12月,并形容它是给自己的圣诞礼物。他说明该公开版已用Modula-3编写、以C为中间代码,并支持完整语言。这是参与者对发行月份的后期记忆,未给出具体日子。

参考:[4] [5]

两所研究机构共同设计

项目由DEC系统研究中心与Olivetti研究中心合作推进。格雷格·纳尔逊后来记述,莫里斯·威尔克斯于1986年11月6日致信尼克劳斯·维尔特,提议把Modula-2+修订为Modula-2的后继语言,得到维尔特支持。设计者包括卢卡·卡尔代利、詹姆斯·多纳休、乔丹、卡尔索与纳尔逊;露西尔·格拉斯曼和纳尔逊承担规范的撰写。

首份《Modula-3报告》的题页日期是1988年8月25日,两家机构随后展开实现工作。1989年1月,设计委员会根据实现经验修订语言,加入带标识的引用类型,并放宽不透明类型的相关规则;记载这些变化的第52号修订报告于11月1日发表。规范首次公开、据实践修订和实现对外发布,因而是前后衔接的不同工作。

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

安全性如何进入系统程序

设计者希望用约五十页能够说明的语言,承担现代系统程序的工作。他们主要筛选已经经过实践的机制:模块通过明确接口协作,不透明类型隐藏内部表示;异常处理把错误传到指定处理位置;线程让程序组织并发活动。保留这些机制的同时,语言舍弃了容易破坏类型约束的变体记录,采用对象。

内存管理是一个直接的问题:记录已经释放,而其他代码仍保留指向它的引用,随后访问就可能造成不可预测的结果。Modula-3使用垃圾收集自动回收不可达记录,同时为底层工作保留非跟踪引用。访问设备总线地址等操作无法由编译器充分保障,因此危险功能被限制在明确标为不安全的模块中,程序员要为这些模块承担额外责任。

参考:[1] [3]

队列例子里的静态与运行时检查

1989年修订报告用一个可复用队列说明对象与子类型。基础对象QueueElem只含连接下一元素的link字段;IntQueueElem在它之上增加整数val。程序创建val为6的整数元素,再把它传给Insert加入队列。所有IntQueueElem都是QueueElem,所以插入时可以使用同一套队列操作,不必为每一种内容重写链接结构。

取出时情况不同。Delete返回的是一般QueueElem,队列中也可能放入其他子类型的元素。把返回值赋给声明为IntQueueElem的变量,编译时无法保证总是正确,于是运行时检查实际对象;不匹配就产生受检查的错误。这个例子把代码复用与错误检测放在一起,展示语言怎样在共享结构时维持类型边界。

参考:[2]

把规范接到工作站上

乔丹介绍的Olivetti工具大多用Modula-3编写,以抽象语法树共享编译单元的表示。编译器先生成C代码,再利用目标机器工具产生可执行程序;预链接器检查编译一致性并计算模块初始化次序。团队在Sun-3和SunOS 3.5上开发,已装到SPARC及运行BSD或Ultrix的VAX上,其他移植仍在进行。

参考:[4]

编译器也成为语言的使用者

卡尔索回顾SRC编译器时,叙述了从Modula-2+编写的最初版本到Modula-3自举的过程。他借助Vulcan环境的语法树工具自动转换大部分源程序,再手工整理,把原先模拟对象的结构改成真正的对象。编译器以C衔接现成的系统库,运行库则在开发过程中逐步增加垃圾收集、线程和异常支持。

纳尔逊1991年书中的致谢把SRC实现归于卡尔索与埃里克·穆勒,把Olivetti实现归于乔丹、特雷弗·莫里斯等人。早期发行因此同时检验两件事:程序员能否根据明确的规范编写代码,以及实现者能否把这种语言接入既有工作站和操作系统。编译器本身使用Modula-3,又把实际开发遇到的问题带回了语言设计。

参考:[5] [3] [2]