Modula-3编程语言全记录:诞生、发展、多版本实现与发行情况揭秘

📅 2026/7/24 21:29:50
Modula-3编程语言全记录:诞生、发展、多版本实现与发行情况揭秘
目录- 致谢- 引言- 语言设计时间线- 实现与发行版本- 库- 应用程序- 开发支持- 资源致谢感谢Marc H. Brown、Luca Cardelli、Michel Dagenais、Dave Detlefs、John DeTreville、Amer Diwan、Jim Donahue、Allan Heydon、Tony Hosking、Bill Kalsow、Al Kossow、Rustan Leino、Eliot Moss、Eric Muller、Farshad Nayeri、Mika Nyström、John Polstra、Klaus Preschern和Olaf Wagner提供的帮助、建议和/或资料。本网站献给Modula-3及其前身语言的设计者以及所有用Modula-3编写库和应用程序的开发者。引言Modula-3是一种在20世纪80年代后期由Luca Cardelli、Jim Donahue、Mick Jordan、Bill Kalsow和Greg Nelson设计的编程语言定义报告由Lucille Glassman和Greg Nelson撰写。它旨在为广泛的系统和应用程序编程提供安全且高效的解决方案涵盖从设备驱动程序等底层代码到程序开发工具再到科学或商业应用程序等多个领域。安全性意味着程序的运行时状态能保证符合语言语义。在实现这些目标的前提下设计者力求让语言尽可能简单其语言定义仅超出50页预算六行文本外加语法摘要。该语言的特性包括接口、对象、泛型、线程、不安全代码隔离、垃圾回收、异常处理和子类型化。到2025年其中许多特性已变得更为普遍但在1990年 [Nelson1991] 时这些特性并不常见尤其是在支持非堆分配数据结构的语言中。Modula-3的诞生源于Maurice Wilkes向Niklaus Wirth提出的建议即对Modula-2进行修订并将其标准化为Modula-3。Modula-2在Xerox PARC之前使用Mesa和Cedar的经验基础上为Wirth的Modula-2增加了线程、垃圾回收和异常处理功能。详见 [软件保护](../) [Mesa](../mesa/) 和 [Modula-2](../modula2/)。由Digital Equipment Corporation Systems Research CenterCardelli、Kalsow和Nelson和Olivetti Research CaliforniaDonahue和Jordan组成的委员会于1988年8月发布了最初的Modula-3设计 [Cardelli1988a]随后两个实验室都开始了相关实现工作。在使用Modula-3编写Modula-3编译器的过程中积累的经验促使在1989年11月对设计进行了一些修订和扩展 [Cardelli1989a]。最终的修订于1990年12月完成 [Nelson1990]。1991年《Systems Programming with Modula-3》一书将该语言介绍给了更广泛的受众 [Nelson1991]。[Nelson1991]的第1章“引言”提供了关于设计过程历史和语言特性的更多细节。第8章“语言特性的由来”是一篇虚构对话揭示了设计者面临的诸多问题。语言设计时间线1984 - 1986年DEC SRC开展Modula-2开发工作 [Rovner1985, Rovner1986]。1986年12月SRC/ORC联合代表团前往ETH拜访Wirth [Donahue1989]。1987年1 - 3月就目标和范围进行早期讨论 [Donahue1989]。1987年4月正式开始设计工作 [Donahue1989]。1987年11月完成第一份完整草案 [Donahue1989]。1988年8月发布《Modula-3 Report》[Cardelli1988a]。两个实验室均开始实现工作 [Donahue1989, Nelson1991]。1989年1月基于实现经验进行修订“主要变化包括引入带标签的引用类型要求不透明类型必须带标签允许不透明超类型以及在揭示不透明类型信息方面提供了新的灵活性” [Cardelli1989c]。1989年10月ORC Modula-3首次公开发布 [Donahue1989]。1989年11月发布修订版《Modula-3 Report》[Cardelli1989c]。1989年12月SRC Modula-3首次公开发布 [Kalsow2021]。1990年12月“十二项更改”增加泛型改进与IEEE 754浮点数的兼容性将RAISES默认为 {}区分方法声明和重写通过语法糖在NEW时进行方法重写允许在常量表达式中使用顶级过程常量允许T.m作为过程常量和方法默认值放宽不透明对象类型的NEW操作要求不透明类型的揭示超类型必须完全有序对EXTERNAL进行更改将TYPECODE的返回类型改为无符号而非有符号对CHAR、TEXT和数字字面量进行更改 [Nelson1990]。1991年首次发布最终语言定义见 [Nelson1991, Nelson1991errata]。1992年发布《Modula-3 Language Definition》[Cardelli1992]。约1996年发布最终 [网络版本](archive/DEC_SRC/release-3.6-html/m3defn/html/m3.html)。实现与发行版本- Olivetti Modula3- DEC SRC Modula-3- UMass Amherst GNU Modula-3- Caltech Modula-3D- Princeton M3- Klagenfurt M3/PC- M3forDOS- Modula-3 for OS/2- Critical Mass CM3- Polytechnique Montréal PM3- University of Washington SPIN Modula-3- Purdue Persistent M3- Cambridge CAM3- EZM3- Elego Software Solutions Modula-3- Github Modula-3M3编译器家族树在最初的语言定义发布后两家公司立即开始了实现工作。Olivetti Modula-3在Olivetti内部使用了一段时间但在1991年2月Olivetti Research California突然关闭后逐渐停止使用。除了马萨诸塞大学阿默斯特分校一个短暂存在的GNU项目外所有后续的Modula-3开发工作都基于DEC SRC Modula-3。Olivetti Modula-3Olivetti Modula-3由Mick Jordan、Trevor Morris、David Chase、Steve Glassman和Marion Sturtevant实现 [Jordan1990, Nelson1991]。该编译器基于一种名为M3AST的通用抽象语法树AST机制。基于M3AST的工具包括编译器前端解析器、语义分析器和控制模块、生成C源代码的代码生成器、预链接器处理全局信息如确定模块初始化顺序和检查接口与模块编译的一致性以及“pickle”对象序列化/反序列化存根生成器 [Jordan1990]。1989年10月首次公开发布 [Donahue1989]。1991年2月Olivetti Research CaliforniaORC关闭后Mick Jordan和Steve Glassman转至DEC SRCJordan还带去了基于AST的工具包。源代码- 版本2.2包含在DEC SRC Modula-3版本2.11中。[未打包](archive/DEC_SRC/release-2.11-unpacked/m3tk/)- 版本未知包含在DEC SRC Modula-3版本3.5.3的 m3/m3tk 目录中。[m3.tar.gz](archive/DEC_SRC/release-3.5.3/m3.tar.gz)- 版本未知包含在DEC SRC Modula-3版本3.6的 m3/m3tk 目录中。[m3.tar.gz](archive/DEC_SRC/release-3.6/m3.tar.gz)- 当前cm3仓库中的m3tkDEC SRC Modula-3 [![我爱 M3](I_Heart_M3-tshirt.jpg)](I_Heart_M3-tshirt.jpg) [![我爱 M3](I_Heart_M3-badge.png)](I_Heart_M3-badge.png)SRC Modula-3由Bill Kalsow和Eric Muller实现 [Nelson1991]。它基于SRC现有的Modula-2语言和编译器进行引导开发。最初版本生成C代码并调用GCC进行编译但从3.0版本开始它被修改为生成一种中间语言可驱动不同的后端。最常用的后端是一个小程序它读取中间语言的文本版本并调用GCC代码生成库。更多详细信息请参阅 [Kalsow 1994, 1995a, 2021]。1995年7月Bill Kalsow离开SRC该编译器在SRC的开发工作转向维护模式。不过除了Olivetti编译器外所有后续的Modula-3编译器和发行版本都基于SRC Modula-3代码库并得到了许多人的贡献。源代码如需了解从1.0到3.5.3版本的完整发布历史3.6版本是对3.5.3版本的小修改请参阅 [Heydon1997]。版本日期发布说明来源在线未打包1.51990年7月23日[PDF](archive/DEC_SRC/release-1.5/release15.pdf)[http://mail.digiater.nl/openvms/decus/lt90b2/m3/](http://mail.digiater.nl/openvms/decus/lt90b2/m3/)[在线](archive/DEC_SRC/release-1.5/)[未打包](archive/DEC_SRC/release-1.5-unpacked/)2.051992年3月13日[PDF](archive/DEC_SRC/release-2.05/doc-2.05.pdf)2.11版本doc目录中的newdoc.dvi--2.071992年7月20日[PDF](doc/Kalsow_Muller-SRC_Modula-3_Version_2_07-1992.pdf)2.10版本doc目录中的doc.ps--2.09未知-Klagenfurt的M3/PC[在线](archive/Klagenfurt/m3pc/)[未打包](archive/DEC_SRC/release-2.09-unpacked/)2.101992年11月-Bill Kalsow的TK50卡带[在线](archive/DEC_SRC/release-2.10/m3.2.10-1992_10.tgz)-2.111993年1月7日[PDF](archive/DEC_SRC/release-2.11-unpacked/doc/doc.pdf)[通过archive.org获取的Prime Time Freeware for UNIX 3.1B版](https://archive.org/details/PTF-F4U31)[在线](archive/DEC_SRC/release-2.11/)[未打包](archive/DEC_SRC/release-2.11-unpacked/)3.1未知-Klaus Preschern的M3forDOS[在线](archive/M3forDOS/)[未打包](archive/DEC_SRC/release-3.1-M3forDOS-unpacked/)3.5.31995年6月-[通过ftp.zx.net.nz访问gatekeeper.dec.com](ftp://ftp.zx.net.nz/pub/archive/gatekeeper.dec.com/pub/DEC/SRC/Modula-3)[在线](archive/DEC_SRC/release-3.5.3/)-3.61996年9月-[通过ftp.zx.net.nz访问gatekeeper.dec.com](ftp://ftp.zx.net.nz/pub/archive/gatekeeper.dec.com/pub/DEC/SRC/Modula-3/)[在线](archive/DEC_SRC/release-3.6/)[文档](archive/DEC_SRC/release-3.6-html/modula-3/html/srcm3.html)GNU Modula-3和Persistent Modula-3马萨诸塞大学阿默斯特分校20世纪80年代后期马萨诸塞大学阿默斯特分校的Eliot Moss对将编程语言和数据库功能集成产生兴趣他计划通过为编程语言数据类型添加持久性来实现这一目标。他和他的研究团队设计了Mneme持久对象存储随后用它来开发Persistent Smalltalk和Persistent Modula-3的原型 [Moss1990]。Persistent Modula-3 [Hosking1990] 基于一个新的Modula-3编译器因为他们在DEC SRC Modula-3发布之前就开始了开发工作 [Hosking1991]“我们选择GNU C编译器作为开发基础它的可移植性满足了我们的首要需求其优化阶段让我们能够解决性能问题。我们的实现工作包括构建一个Modula-3编译器前端以及对后端进行必要修改以支持持久性和垃圾回收。”该编译器生成汇编语言和表格以便本地开发的垃圾回收器能够精确找到所有可回收对象 [Diwan1992, Hudson1991]。Caltech Modula-3D加州理工学院的Mosaic C多计算机基于具有二维互连的单芯片节点 [Seitz1993]。Rustan Leino为他的硕士论文设计了Modula-3D这是Modula-3的一个分布式扩展版本用于Mosaic多计算机 [Leino1992, 1993]“我记得Mosaic有256个核心也可能这是最终目标每个核心有64 KB的按字寻址16位字RAM。我的运行时系统包括垃圾回收器、进程间通信和网络对象每个核心使用32 KB的内存。” [Leino个人通信2021]文档和论文[Leino1992]plaintextK. Rustan M. Leino. Extensions to an object-oriented programming language for programming fine-grain multicomputers. Technical Report, Caltech-CS-TR92-26, California Institute of Technology, 1992.[Leino1993]plaintextK. Rustan M. Leino. Multicomputer Programming with Modula-3D. Masters thesis, California Institute of Technology, 4 June 1993. https://doi.org/10.7907/Z9F18WSP摘要在本文中我们扩展了一种面向对象语言以支持细粒度多计算机编程。新的构造具有简单的语义为编写分布式程序提供了一种很好的方式。这些构造的语义与程序的分布方式无关。我们还展示了一组简单的条件在这些条件下即使程序的执行结果也与控制和数据的分布方式无关。我们展示了该编程模型的优缺点并描述和评估了我们对该语言的实现。[Seitz1993]plaintextCharles L. Seitz, Nanette J. Boden, Jakov Seizovic, and Wen-King Su. The design of the Caltech Mosaic C multicomputer. In _Proceedings of the 1993 Symposium on Research on Integrated Systems_. MIT Press, Cambridge, 1993, pages 1–22.源代码- Modula-3D发行版基于大约1992年3.0版本之前的SRC Modula-3版本。[m3d.tgz](archive/Leino/m3d.tgz) / [未打包](archive/Leino/m3d/)Princeton M3Mary F. Fernandez研究了Modula-3的不透明类型与单独编译之间的交互所导致的额外间接开销问题。她开发了链接时优化技术来避免这种开销“我们描述了Modula-3链接时优化的机会并提出了两种链接时优化技术。数据驱动简化是一种新技术。它利用程序的类型层次结构完全弥补了不透明类型的成本并降低了方法的运行时开销。它还揭示了其他优化机会如常量和类型传播、过程内联和克隆。基于分析的优化使用分析数据来转换那些从数据驱动简化所带来的优化中受益最大的过程。此外我们的技术使得优化库中的过程和应用程序中的过程一样容易。” [Fernandez1995b]为了测试这些想法她在DEC SRC Modula-3 2.11修改版上运行基准测试该版本的后端生成C源代码。她使用自己的mlcc和mld这是一个与机器无关的C编译器和一个可重定向的优化链接器。她只需要对Modula-3编译器进行适度修改添加了87行新代码。通过运行基准测试她发现“mld的优化简单而有效。数据驱动简化最多可将执行的指令总数减少11%并将多达79%的间接调用转换为直接调用。基于分析的优化最多可将执行的指令总数减少14%并将执行的加载次数减少19%。” [Fernandez1995b]文档和论文[Fernandez1994]plaintextMary F. Fernandez. Simple and Effective Link-Time Optimization of Modula-3 Programs. Technical Report TR–474–94, Princeton University, November 1994. [Online at www.cs.princeton.edu](https://www.cs.princeton.edu/research/techreps/174)[Fernandez1995a]plaintextMary F. Fernandez. The Implementation of mlcc and mld: A Machine-Independent Compiler and a Retargetable, Optimizing Linker. Technical Report TR–490–95, Princeton University, May 1995. [Online at www.cs.princeton.edu](https://www.cs.princeton.edu/research/techreps/190)[Fernandez1995b]plaintextMary F. Fernandez. Simple and effective link-time optimization of Modula-3 programs. In _Proceedings of the ACM SIGPLAN 1995 Conference on Programming Language Design and Implementation (PLDI 95)_. Association for Computing Machinery, New York, June 1995, 103–115. [ACM Digital Library](https://doi.org/10.1145/207110.207121)[Fernandez1996]plaintextMary F. Fernandez.Link-Time Optimization for Modula-3. _Threads: A Modula-3 Newsletter_, Issue 2, Fall 1996. [HTML at modula3.org](https://www.modula3.org/threads/2/#linkTimeOptimization)Klagenfurt M3/PC“这是 [Modula-3](https://web.archive.org/web/19970801174000/http://www.ifi.uni-klu.ac.at/Modula-3/html/modula-3/html/home.html) 在普通DOS-PC上运行的一个版本。它主要面向本科编程课程的学生和其他Modula-3编程初学者。它由 [克拉根福大学信息学系](https://web.archive.org/web/19970813041239/http://www.ifi.uni-klu.ac.at/) 开发。我们将其用于编程入门课程。该系统实现了Digital Systems Research Centers [Modula-3](https://web.archive.org/web/19970813041239/http://www.ifi.uni-klu.ac.at/Modula-3/html/modula-3/html/home.html) 实现的2.09版本。...贡献者- Klaus Preschern首次将Modula-3移植到PC上。- Carsten Weich重写了Klaus Preschern移植的部分代码并编写了m3shell。这些项目由Laszlo Boszormenyi指导。” [Weich1996]---“我从DEC工作站交叉编译到 [DJ Delorie的DOS扩展器](https://en.wikipedia.org/wiki/DJGPP)这是MS-DOS上GNU C编译器的一个平台。” [Preschern2026]源代码- 最初来自 gatekeeper.dec.com/pub/dec/SRC/Modula-3/contrib/m3pc1995年1月3日。[在线](archive/Klagenfurt/m3pc/)- 镜像[ftp://ftp.zx.net.nz/pub/archive/gatekeeper.dec.com/pub/DEC/SRC/Modula-3/contrib/m3pc](ftp://ftp.zx.net.nz/pub/archive/gatekeeper.dec.com/pub/DEC/SRC/Modula-3/contrib/m3pc)Klaus Preschern / M3forDOSKlaus Preschern于1992年在DEC SRC与Bill Kalsow实习。离开克拉根福大学后他开发了一个名为EX32的替代Modula-3 PC系统。他的第一个版本于1994年3月27日发布基于SRC M3 2.11版本 [Preschern2026]。最终版本基于SRC M3 3.1版本plaintextEX32“DOS的32位扩展”是一个用于在DOS上开发和执行32位应用程序的环境。EX32是一组DOS程序驱动程序 内核。它为在保护模式下执行的应用程序提供服务。它进行进程管理、虚拟内存管理、通过管道进行进程间通信并提供一个支持32字符文件名的文件系统。EX32可在MS-DOS 5.00、6.00和6.02上运行。你需要一个i386/i387需要协处理器或更高版本i486、奔腾的处理器。EX32支持DOS XMS内存但不支持EMS、VCPI或DPMI。不支持i286处理器。你至少应该有4 MB内存建议8 MB或更多。整个软件包解压和展开后大约占用44 MB的磁盘空间。EX32附带GNU C2.4.5版本、**SRC Modula-33.1版本包括线程**、两个C库、一个用于VGA的图形库和一些命令如ls、cp、rm、mkdir、make等。[[Preschern, README.1st, 1996年6月