从SAGE经验到新的系统任务

1958年末,系统开发公司(System Development Corporation,SDC)的一小组研究者试验如何分析数学和逻辑表达式。朱尔斯·施瓦茨、欧文·布克及哈维·布拉特曼参与其中;国际代数语言IAL的公开说明,为他们提供了语言结构的参照。IAL后来被称为ALGOL,这种联系来自最初的设计基础,而非JOVIAL持续追随每一版ALGOL。

美国空军新的战略空军司令部控制系统SACCS,需要计算机、操作系统、工具程序和业务程序相互配合。施瓦茨在新泽西提出采用高级语言开发该系统,新项目由此启动;加利福尼亚一组则继续发展CLIP编译研究。早期团队分处两地,既交流方法,也产生了不同的实现方向。

参考:[1] [2]

把共享数据写成明确的结构

团队此前参与过半自动地面防空系统SAGE,知道大型工程中许多程序必须理解同一组数据。JOVIAL沿用通信池COMPOOL的思想,把系统数据的说明集中管理,减少各程序各自假定字段位置所产生的协调问题。它的目标因此超出算术公式,还要处理符号、状态和机器字中的数据。

语言把数据项item组合成描述某个对象的entry,再把同类记录组织为table。例如飞机可以有多个数据项,而一张表包含许多飞机记录。状态项可用GOOD、FAIR、POOR等符号值表示,编译器负责内部编码。对程序员来说,识别对象及字段的意义,比手算每个字段处于第几个机器字更直接。

参考:[1] [2]

同一段循环怎样适应不同布局

施瓦茨后来回顾早期语言时,给出一个很小的循环:先写“FOR I = 0, 1, 10$”,再写“D($I$) = 5$”。第一句让下标I从0逐次增加到10,第二句把对应记录中的D项赋为5,共处理十一条记录;行末的美元符号承担语句结束标记,“($”与“$)”则括起下标。

这个例子的重点在于数据布局。串行表把一条记录的各字段放在相邻位置,平行表则把各条记录中的同一字段组集中排列。使用者仍能用相同下标表达式访问D,编译器依据数据说明计算地址。表结构的说明与处理动作由此分开,调整布局时,许多业务语句可以保留。这里展示的是原作者的语言片段,不是一份带齐声明的独立可执行程序。

参考:[2]

文书、内部使用与交付

施瓦茨1978年的回忆指出,首份正式说明于1959年4月出现,5月即被下一份取代,9月还有进一步文书。1959年秋,团队已用一个早期编译器为下一版工作;J0解释器在1960年1月投入早期使用。文档与实现同时变化,不能把其中任何一次内部版本出现,概括成语言已经完成统一发布。

1960年5月,SDC决定采用JOVIAL作为公司共同编程语言,组织公共生成器及不同计算机的翻译器项目。1960年说明书仍把若干可用编译器列为次年春季的计划;后来施瓦茨记录,IBM 7090上的J2于1961年3月交付,AN/FSQ-31版本稍后交付。计划日期与实际使用记录应分别保留。

参考:[1] [2]

统一设计遇到的实际限制

公司方案把编译分为两步:公共生成器把语言和数据说明转换为中间语言,再由针对具体计算机的翻译器产生机器代码。这样既期望减少重复工作,也希望在不同机器上维持共同语言。CLIP还被用于编写生成器,使编译工具本身成为高级语言的使用者。

共同设计并没有自动带来完全兼容。施瓦茨承认,早期数据声明的语法难记,语义说明不够精确,两地版本也有差别;最初甚至没有直接纳入输入输出和中断处理指令,而是依靠过程调用或机器数据访问解决实际问题。JOVIAL的发展显示,大型系统语言是在程序协作、机器约束和不断修订的实现中逐步形成的。

参考:[1] [2]