历史背景
与Fortran语言一样,PL/I是作为IBM的一项产品被开发的。早在20世纪60年代的初期,工业界中的计算机用户就被分为两个相互独立而又相当不同的阵营。以IBM的观点,从事科学计算的程序人员可以使用IBM的7090大型计算机或者1620小型计算机。正是这一部分人员,极大量地使用浮点数据类型和数组。他们使用的主要语言是Fortran,但也使用一些汇编语言。他们有着自己的用户团体SHARE,而且他们与工作于商务应用领域的人员极少联系。
对于商务应用,人们使用IBM的7080大型计算机或者1401小型计算机。他们需要十进制及字符串数据类型,也需要精细和高效的输入及输出设施。他们使用COBOL语言。尽管在1963年的初期,关于PL/I语言的故事才刚刚开始,而那时从汇编语言至COBOL的转换还远没有完成,他们却已经使用了COBOL。这种类型的用户也有自己的用户团体GUIDE,并且他们也很少与科学计算类型的用户联系。
在1963年初,IBM的规划人员感觉到这种情况在开始变化,这两个互相远离的计算机用户团体正在向彼此靠近的方向移动。IBM的人员认为这必定会产生问题。当时,科学家们已经开始采集大型文件数据来进行处理,这些数据需要更复杂更高效的输入输出设施。而商务应用的人们开始应用回归分析来建立信息管理系统,其中需要使用浮点数据和数组。这开始显示,很快人们会需要两台不同的计算机以及不同的技术人员来进行计算装载工作,以便支持两种非常不同的程序设计语言。
这种感觉十分自然地导致人们想要设计一种通用计算机的想法,这种计算机应兼有浮点数运算以及十进制算术运算的能力,因而能够同时实施科学应用以及商务应用。IBM System/360系列计算机的原理就由此而诞生。随之而来的想法便是,需要一种能够兼用于科学以及商务应用的程序设计语言。作为锦上添花,这种语言还增添了系统程序设计和表处理的语言特性。因此,这样的新语言被计划用来替代Fortran、COBOL、LISP,以及汇编语言的系统应用。2
设计过程语言的设计工作开始于1963年10月,当时IBM和SHARE成立了“SHARE Fortran项目的高级语言开发委员会”(the Advanced Language Development Committee of the SHARE Fortran Project)。这个新委员会的成员很快碰头,并成立了一个被称为3×3委员会的子委员会,之所以这样命名,是因为它的三个成员来自于IBM,而另外三个成员来自于SHARE。3×3委员会每隔一个星期开会三天或四天,来设计新的语言。
就像COBOL的短期委员会一样,他们要在相当短的时间内完成初步的语言设计。显然在20世纪60年代初期盛行的观念是,不论这种语言设计的工作量如何,都可以在三个月之内完成。PL/I语言的第一个版本(当时被命名为Fortran VI)原定于子委员会成立之后不到三个月的时间即12月前完成。委员会成功地申请了延期,将完成时间推移到了1月份,进而又再次推移到了1964年2月的下旬。
在最初的设计构想中,新语言将是Fortran IV的一种扩展,以便维持语言的兼容性。但很快,这个目标连同名字Fortran VI一起被弃用。到1965年之前,这种语言一直被称为NPL,源于英文“新程序设汁语言”(New Programming Language)的首字母组合。NPL语言的第一次发布报告于1964年3月在SHARE会议上公布。接着在4月份,发表了NPL语言的比较完整的描述,而它能够被实际实现的版本于1964年12月由英国的IBM Hursley实验室的编译器工作组发表(IBM,1964)。该工作组专门进行这种语言的实现工作。NPL语言的名字在1965年被改为PL/I,以免与英国国家物理实验室(National Physical Laboratory,NPL)的名字相混淆。假如PL/I的编译器是在英国之外开发的,它的名字可能会保持为NPL。2
语言概述描述PL/I语言最为贴切的一句话也许是,它包括了下列这些语言中当时被认为最优秀的部分:ALGOL 60的“递归与块结构”、Fortran IV的“通过全局数据来分开编译与通信”,以及COBOL 60的“数据结构、输入/输出以及生成报告的设施”,还包括一系列相当多的新结构,并将所有这些部分糅合在一起。因为PL/I现在几乎是已经死去的语言,所以我们不会哪怕只以简略的方式来讨论这种语言的所有特性,或者它的最具争议的结构。我们只是简要地概括这种语言对于程序设计语言知识库的一些贡献。
PL/I是第一种具有下列设施的程序设计语言:
1、允许程序产生并发执行的子程序。这虽然是一个好主意,但是这种功能在PL/I中的开发却很差。
2、可以发现并处理23种不同种类的异常或运行时错误。
3、允许子程序递归,但为了便于非递归子程序高效率地链接,也可以停止递归功能。
4、指针被作为一种数据类型。
5、可以单独引用数组的横向部分。例如,可以将矩阵的第三行作为一个矢量来引用。