从运筹研究到语言设计
Simula起源于挪威奥斯陆的挪威计算中心。克里斯滕·奈加德研究生产、交通等复杂系统时,需要把排队、服务和状态变化写成能够讨论、也能够运行的模型。单有流程图并不足以直接产生计算机程序;逐个问题重写调度和数据管理代码,又会使模拟工作十分繁重。
合作伙伴奥勒-约翰·达尔擅长程序语言与实现。两人此前都在挪威国防研究机构工作,分别带来运筹研究和基础软件经验。Simula因而同时追求两件事:精确描述系统,以及把这种描述变成模拟程序。
1962年的方案与合作条件
奈加德在1961年开始酝酿相关语言;1962年1月5日致法国运筹学者夏尔·萨尔兹曼的信,是设计者后来列出的最早Simula书面记录。达尔与他在1962年春反复讨论,5月形成可以向外介绍的语言方案。奈加德当年8月在慕尼黑的国际信息处理联合会大会介绍其构想,会议论文于次年刊出。
同年赴美考察UNIVAC计算机时,奈加德也推介了Simula。此后的软件合作与设备采购相联系,为挪威计算中心提供实现条件;UNIVAC 1107于1963年8月抵达。达尔则在完成原单位项目后,于1963年3月正式到中心任职。1962年所标志的是方案形成和对外展示,而非成熟编译器交付。
让模拟进程保存自己的状态
Simula以ALGOL 60为基础,但模拟要求多个活动交错推进。普通程序块按调用次序进入、退出的堆栈方式,不能直接容纳这种需要。设计者改造存储管理,使暂时停止的进程能够保留局部数据和恢复执行的位置。
1966年的原始论文把进程解释为兼具数据与行动的单位:活动声明规定一种进程,运行时可以产生多个实例;进程引用用来找到具体实例,集合机制组织队列。所谓“准并行”是各进程的活动阶段轮流执行,并不要求计算机同时运行所有进程。hold操作则让调用者在模拟时间中暂停,再由调度机制安排后续活动。
汽车与警察的程序例子
达尔介绍过一个来自早期手册、略加扩展的道路交通模型。汽车进程保存基准位置、基准时间和速度;计算当前位置时,用经过的模拟时间乘以速度,再加上基准位置。改变速度的操作先更新位置和时间,再记录新速度,避免把过去的整段行程都按新速度重算。
另一个警察进程检查汽车:若车辆处于城市范围且速度超过设定值,就调用减速操作,并执行罚款动作。这里,汽车的状态与处理这些状态的操作归在一起,警察通过受语言约束的访问机制与汽车交互。这个例子展示了后来对象思想的一项具体来源,而非仅仅把现实名词改写为变量名。
从可运行系统到公开论文
达尔回忆Simula I在1964年底已经运行;1966年论文则明确记载,UNIVAC 1107上的编译器自1965年1月投入运行。两项记载把可运行实现的时间定位在1964年底至1965年初。1965年5月出现用户手册,当年还举办了三次课程,应用扩展到生产计划、运输、港口和计算机运行等问题。
1966年9月,达尔与奈加德在《美国计算机学会通讯》发表语言介绍,系统说明进程、引用、集合及时间控制。论文与课程使研究者能够检查其规则、编写模型,传播不再只依靠最初的设计讨论。
后续的Simula 67
使用Simula I后,设计者发现进程的数据与操作可以服务于一般程序设计,某些模型之间又有共同属性需要复用。随后形成的Simula 67以类、对象和子类组织这些关系,以类前缀表达继承,并加入虚过程机制。模拟设施可以在较一般的语言机制上组织起来。
这一步属于后续版本的重构。它与1962年的网络模拟方案、1965年的Simula I实现之间存在连续的研究过程,但各阶段的概念和可用功能不能合并为一次发布。