程序设计语言发展回顾与展望

摘自互联网(东南大学 徐宝文 南京大学 郑国梁)


编者按: 程序设计语言是与现代计算机共同诞生、共同发展的,至今已有40余年的历史,早已形 成了规模庞大的家族。进入80年代以后,随着计算机的日益普及和性能的不断改进,程序设 计语言也相应得到了迅猛发展。

《程序设计语言发展回顾与展望》一文对程序设计语言的发展历程进行了回顾,并对一 些著名语言的背景、特点、长处与不足,及其对程序设计语言发展的贡献作出了评述。

程序设计语言是人们为了描述计算过程而设计的一种具有语法语义描述的记号。对计 算机工作人员而言,程序设计语言是除计算机本身之外的所有工具中最重要的工具,是其它 所有工具的基础。没有程序设计语言的支持,计算机无异于一堆废料。由于程序设计语言的 这种重要性,从计算机问世至今的半个世纪中,人们一直在为研制更新更好的程序设计语言 而努力着。程序设计语言的数量在不断激增,各种新的程序设计语言以及现有程序设计语言 的方言在不断面世。目前已问世的各种程序设计语言有成千上万个,但这其中只有极少数得 到了人们的广泛认可。

最早的一代程序设计语言是机器语言;第二代语言是汇编语言;第三代语言是所谓的高 级语言,它主要有四种范型:命令式语言、函数式语言、逻辑式语言与对象式语言;第四代语 言是面向数据库的,实际上它不只是语言而且也是交互式程序设计环境。程序设计语言的发 展主要经历了这四代,也有人把逻辑式语言、函数式语言,甚至于对象式语言称为第五代语 言。这五代语言中,前三代语言的发展有明确的先后界限,而后三代语言之间则没有这些界 限,它们仍然在同时发展。

一、"史前"时期

我们先来回顾一下计算机问世以前人们为程序设计语言的问世与发展所做的工作,这些 工作为程序设计语言及其理论的问世与发展奠定了很好的基础。

最早的"计算机"是我们中国的算盘,它被人们沿用了不知多少个世纪。在17世纪Pascal 等人发明了一种以传动齿轮为基础的"计算机",它用齿轮的转动来控制计算的累加与进位。 上个世纪初,英国剑桥大学著名数学家Charles Babbage的工作使他成了计算机领域的先 驱;他于1822年与1848年分别设计出了两种差分机,并于1833年制造出了有名的分析机。分 析机在原理上与当今意义上的计算机很类似:其主要作用是输入读进穿孔卡片、对输入执行 算术运算并给出结果,它可以随意重复运算序列。这些运算序列是由Ada Lovelace设计的, 她设计了许多可以求解一大类问题的运算序列。这种运算序列实际上就是程序的雏形,其思 想一直沿用至今,因而Ada被称为是世界上第一个程序员(Ada语言就是为纪念她而命名)。 1890年Hollerith研制出了一种统计机,它也使用穿孔卡片,它被用作各种统计工作。 Hollerith因此而成立了一个公司,这个公司以后发展成IBM。本世纪30年代,英国数学家Turing提 出了图灵机的概念,它由一个控制块、一条存储带及一个读写头构成,能执行左移、右移、 在存储带中清除或写入符号、条件转移等操作。图灵机的结构虽然比较简单,但却能完成当 今计算机所能完成的一切运算。随后Church发明了一种以逻辑公式中约束变量的代入为主 要运算的λ-演算,它可以看作是一种语法与语义都非常简单的程序设计语言,已被广泛用在 程序理论与程序设计语言理论与实践的研究中。

二、低级语言时期

1944年,美国哈佛大学的Aiken设计出了MARKI自动程序控制继电器式计算机,它使用了 Babbage分析机的原理,这是世界上第一代自动计算机,其机械结构原理与当代计算机基本相 同,只是速度很慢:加法每秒才3次。1944~1946年间宾夕法尼亚大学的Mauchly与Eckert研 制出了ENIAC电子数字积分计算机。1949年,普林斯顿大学von Neumann研制出了EDVAC电子 离散变量计算机,这是世界上第一台能把可执行的程序放在磁芯中的计算机,从此现代意义 上的计算机便真正诞生了,这台计算机一问世便奠定了所谓von Neumann式体系结构:程序与 数据不加区别地存储在(磁芯)存储器中。它所能处理的最基本的信息单位就是二进制数字, 即计算机只能识别理解由0与1构成的二进制序列。那时人们要用二进制机器代码编成代码 序列(即程序)来控制计算机执行规定的操作。这种代码就是第一代程序设计语言或称机器 语言。机器语言的特点是它能直接反映计算机的硬件结构,用之编写的程序不须作任何处理 即可直接输入计算机执行。编写机器语言程序是一种非常枯燥而繁琐的工作,要记住每一条 指令的编码与含义极端困难,编写出的程序既不易阅读也不易于修改。而且由于机器语言是 特定于机器的,不同的机器有不同的指令系统,人们无法把为一种机器编写的程序直接搬到 另一种机器上运行。一个问题如果要在多种机器上求解,那么就要对同一问题重复编写多个 应用程序。由于机器语言程序直观性差,与人们习惯使用的数学表达式及自然语言差距太 大,故而难学、难记,程序难以编写、调试、修改、移植和维护,限制了计算机的推广作用。

由于这一问题的存在,人们设想,能不能用更接近于自然语言与数学语言的语言。经过 努力,第二代语言——汇编语言问世了。汇编语言也是一种面向机器的程序设计语言, 它用助记符号来表示机器指令的操作符与操作数(亦称运算符与运算对象),如,用"ADD"与 "MOVE"分别取代机器语言中的加法与代码移动操作。汇编指令与机器指令之间关系是一对一 的关系,汇编语言程序要经过一特定的翻译程序(即汇编程序)将其中的各个指令逐个翻译成 相应的机器指令后才能执行。汇编语言的问世使人们在编写程序时不必再花较多的精力去 记忆、查询机器代码与地址,编程工作变得容易多了。

尽管与机器语言相比,汇编语言的抽象程度要高得多,但由于它们之间是一对一的关 系,用它编写哪怕是一个很简单的程序,也要使用数百条指令。为了解决这个问题,人们又研 制出了宏汇编语言,一条宏汇编指令可以翻译成多条机器指令,这使得人们的程序设计 工作 量得以减轻一些。为了解决由多人编写的大程序的拼装问题,人们又研制出了连接程序,它 用于把多个独立编写的程序块连接组装成一个完整的程序。虽然汇编语言比机器语言好学、 好记、好用,但由于汇编语言一般都是针对特定的计算机或计算机系统设计的,因此它对 机器的依赖性很强,它的低级性也使得人们不易于用它编写较大的程序,而且在机器语言中 存在的许多其它问题在汇编语言中没有得到很好解决。

三、高级语言初创时期

1.FORTRAN语言 世界上第一个高级程序设计语言是在50年代由John Backus领导的一个小组研制的 FORTRAN语言。Backus当时一边研制FORTRAN一边研究了将这种代数语言翻译成机器语言的可能 性。由于人们当时头脑中最关心的问题不是这种语言能否设计与编译,而是担心它经翻译后 执行时能不能保持一定的运行效率。这一担心大大影响了FORTRAN的设计方向。最早的一个 FORTRAN版本FORTRAN0是1954年前后设计出来的,其编译程序于两年后研制出来。与此同时, 其后继版本FORTRANⅠ与FORTRANⅡ也相继问世。FORTRAN一问世便受到了极大的欢迎并很 快流行起来。

FORTRAN是一个处处注重效率的语言,这从其各种成分(如控制语句中表达式与数组上标 中的表达式的形式以及子程序参数的传送方式等)就可以看出来。FORTRAN首先引入了与汇 编语言中助记符有本质区别的变量的概念,它奠定了程序设计语言中名字理论的基础。它所 引入的表达式、语句、子程序等概念也是高级程序设计语言的重要基石。但由于FORTRAN是 从低级语言的土壤中破土而出的,其许多成分中"低级"的痕迹随处可见。目前常用的 FORTRAN版本是FORTRAN77与FORTRAN90。

2.ALGOL语言

ALGOL语言是在50年代后开始研制的。1958年ALGOL58问世,过了两年,与ALGOL58风格差 别甚大的ALGOL60发表。ALGOL60与FORTRAN一样都是用于科学计算的程序设计语言,但它们 的风格完全不同,FORTRAN是一个固定格式的块结构语言,在某种意义上它可以看作是模块程 序设计与分别编译概念的始祖(尽管这两个概念在目前的内涵与在FORTRAN中有关设施所展 示的内涵有很大的不同),而ALGOL60则是一个自由格式的分程序结构的程序设计语言。FOR TRAN语言因其高效率与完善的输入输出功能并得到像IBM这样大的公司的支持,而一直受到 人们的欢迎,至今仍在科学计算领域内充满了生命力,而ALGOL60则因其执行效率不及FORTR AN以及缺少标准输入输出设施而遭受应用人员冷落。但这并不是说ALGOL60不及FORTRAN好, 恰恰相反,ALGOL60对现代程序设计语言的发展所起的作用是FORTRAN所无法相比的,也是无 法估价的。

ALGOL60因其具有准确而完备的文本以及采用了精确而形式化的语法描述体系——BNF 范式,而备受程序设计语言研究与设计者的青睐(有趣的是,Backus所发明的BNF范式没有用 在他所设计的FORTRAN中而却被成功地用来描述ALGOL60语法)。ALGOL60中孕育了许多很有 用的程序设计与程序设计语言思想,如自由程序格式、保留字、数据类型、分程序概念、子 程序调用方式、递归、动态数据、条件语句与循环语句的形式等,这些概念中有不少在 ALGOL60中就是很成熟的,有的在后来得到了进一步发展。这些思想一直到现在都影响着程序设 计语言的设计。在ALGOL60以后人们以它为基础研制了不少类ALGOL语言,如N.Wirth于60年 代中期研制出了ALGOL-W与Enler语言,此后问世的几个语言,如PL/I、ALGOL68、SIMULA67、 BCPL、PASCAL等,都直接受到了ALGOL60的影响,象MODULA-2、C、OBERON、Concurrent Pascal、Ada、SMALLTALK与EIFFEL等目前比较有名的语言也或多或少地受到ALGOL60的影响。

3.COBOL语言

早在50年代后期,美国国防部(DOD)就觉得需要研制一个军用语言,它组织了来自政府、 产业部门等的专家来设计这种语言,COBOL就这样在1959年年底研制出来了。 一年后,RCA与 Remington-Rand-Uniuac公司研制出了可以使用的COBOL编译程序。政府部门与产业部门的 合作使得COBOL得以广泛使用,六、七十年代的大量程序都是用COBOL编写的。80年代以来由 于数据库技术的广泛应用,COBOL的使用受到一定限制,但仍在一定范围内使用着。COBOL对 语言发展的主要贡献是其引入的独立于机器的数据描述概念(它是数据库管理系统中主要概 念的鼻祖)与类英语的语法结构。COBOL的出现,使人们开始意识到计算机不只应用于科学计 算领域,而且还可以进入各种事务处理领域,拓宽了计算机的应用范围。

四、高级语言发展初期

FORTRAN、ALGOL60与COBOL三个语言问世后,在六十年代初期,编译技术与理论的研究得 到了高度重视,在短短几年中得到了很大发展,许多语言翻译中的问题也得到解决,这又反过来 使人们把注意力放在各种新的程序设计语言的研制上,这导致了程序设计语言数目成指数般 的激增。在六十年代的十年中,人们至少研制了200多个高级语言。

前已指出,虽然FORTRAN与COBOL当时已经分别成为科学计算与商业应用的标准语言,但 ALGOL60仍对新语言的设计起着比较大的影响。ALGOL-W与Euler是受ALGOL60影响最大的类 ALGOL60语言中的两个。ALGOL-W的主要贡献是提出了一种叫做值-结果的新的子程序参数传 递方法,并首次引入了分情形语句、记录、指针等重要的语言概念。Euler则试图把过程当作 对象处理并引入了简单优先级分析的技术。对这两个语言的研制为N.Wirth后来研制的 Pascal取得成功奠定了基础。

在五十年代末至六十年代初期,除了研制了若干普通过程性程序设计语言而外,还有一 些人作了研制其它风格的程序设计语言的尝试,LISP、APL与SNOBOL就是这样的三个程序设 计语言。

1.LISP语言

早在50年代后期,麻省理工学院的John McCarthy就开始了人工智能的研究,他当时致力 于设计一个用表处理的递归系统,这就在60年代初研制出了LISP语言,它是一个用于处理符 号表达式的相当简单的函数式程序设计语言。LISP以数学中的函数与函数作用的概念作为 其设计原理,它奠定了函数式语言的基础。纯LISP语言是完全非von Neumann风格的,它没有 使用ALGOL60等语言中所采用的可修改变量、赋值语句、转向语句等von Neumann结构语言 中的有关概念。LISP程序与其数据结构采用了完全相同的结构形式与处理方式,因此可以相 当方便地用LISP来编写它的解释程序。LISP语言除了用S-表达式来统一处理数据与程序外, 还引入了前缀运算符表示法、递归数据结构、递归控制结构以及新的条件表达式形式。

2.APL语言

APL是一种风格的函数式程序设计语言,但它的设计与LISP没有关系,它是由IBM公司的 K.Iversion于60年代初期设计的,他的目标是设计出一种功能强而且紧凑的表示法。APL采 用和体现了许多数学概念,最初主要用于完全形式地描述 IBM/360系列计算机。APL具有非 常丰富的运算符(尤其是有关数组的各种运算符),使程序员不再需要使用低级重复的、逐元 素的数组操作。

但由于APL使用了非标准字符集,在APL问世后的许多年内,它都没有得以实现,直到60 年代中期才在IBM/360系列机上得以实现。

3.SNOBOL语言

另一个非ALGOL60风格的语言是SNOBOL,它是由贝尔实验室的Farber、Griswold与 Polonsky研制的,主要用于字符串处理,因此它处理的主要对象是字符串数据,它的复杂的字符串 处理功能是其后各个语言所无法相比的,它目前主要用于模式配领域,其较新且实用的一个 版本是SNOBOL4。

LISP、APL与SNOBOL语言由于与von Neumann体系结构计算机之间存在一定的“语义间隙”, 在一般常规计算机上难以有效地实现:它们都要进行高度动态的资源管理,需要占用大量的 机器资源。但这几个语言都是相应的特定应用领域内非常成功的语言,并一直为这些领域的 用户广泛使用着。例如,LISP语言已成为人工智能研究与应用领域的主要语言之一,APL语言 被广泛用在快速原型及大量涉及到矩阵运算的科学计算领域,SNOBOL4被成功地用在文本处 理领域中。直到现在,这些语言的基本原理仍在研究与产业领域得到广泛的注意。 这几个语言虽然重要,但当时只有少数人在研究它们,绝大多数人的注意力仍然放在过 程性语言(现在也叫命令式语言或强制式语言)上。现在仍来看看六十年代程序语言的发展。

4.PS/I语言

60年代初期,IBM公布了一个庞大的计划:研制PL/1语言。它试图把此前问世的所有语言 的好的思想与设施都用到这个语言的研制中,使PL/I成为一个真正通用的、全能的程序设计 语言。它借用了FORTRAN语言中的独立模块概念、ALGOL60中的分程序结构与递归过程概念、 COBOL的数据描述设施以及LISP的动态数据结构概念。除此而外,PL/I还引入了一些新的 设施,比较突出的是异常处理设施与多任务设施。从目前的角度看,PL/I的设施并不很多,但 可能由于它问世得太早,与当时程序设计语言的发展水平不太相称,它没有以统一而协调的 方式把其不同成分与概念有机地融合在一个语言中。而且,它所引入的一些新设施在当时还 没有得到深入彻底的研究,把它们用在一个实用语言中尚欠成熟。所有这些都影响了PL/I的 成功(它的标准定义在十多年后的1976年才正式发布)。PL/I在当时是一个非常大而复杂的 语言,正如E.W.Dijkstra在1972年获图灵奖时的讲演上所指出的:使用PL/I就象驾驶一驾在 驾驶室中要操纵7000个按钮、开关与手柄的飞机。

5.ALGOL69语言

在60年代问世的语言中还有三个比较著名:ALGOL68、SIMULA67与BASIC。ALGOL68是由 FIFIP的一个以von Wijngaarden为首的工作组(即2.1工作组)在参与了ALGOL60设计与修改 工作后,于1968年研制的。ALGOL68中最重要的概念是正交性:即ALGOL68所包含的各种成分 结构可以任意合成,而不会产生不利的或不期望的结果。ALGOL68作了用不同的语言概念相 互配合来提供较高计算能力的尝试。ALGOL68是第一个用完全形式化技术进行描述的语言, 但其描述技术相当复杂,一般人很难以阅读、理解与使用。ALGOL68因其复杂受到了以 C.A.R.Hoare与N.Witrh为代表的一批人的极力反对,它目前主要用在欧洲的一些大学与研究机构, 但其应用很有限。

6.SIMULA语言

SIMULA语言是由挪威计算中心的K.Nygoard与O.J.Dahl研制的,他们先研制了SIMULA1语 言,后来在1967年发展成SIMULA67语言。SIMULA67虽然是基于ALGOL60的,但它不是作为一种 通用语言设计的,而是一种用于处理仿真问题的语言。它的最大贡献是提出了类的设施,类 是一种用一把数据结构及处理用的过程封装在一起的机制。这一概念可以看作是抽象数 据类型之父。类可以分层定义,因而具有继承性,而且在一个程序中可以对同一类动态地生 成(产生)多个实例。类的概念影响了此后许多语言的设计,其中比较著名的语言有:CLU、 Modula-2、Ada、SMALLTALK、C++等。类概念的提出奠定了面向对象程序设计技术与语言的 基础。另外,它的共行程序可以看作是并行处理设施的雏形。

7.BASIC程序

BASIC语言也是在60年代中期问世的语言,现在仍被广泛使用着。它具有简单的语法形 式与有限的数据结构与控制结构。它的流行得益于它的简单性、实现的方便性与高效率,但 它本身并没有引入什么新的语言概念,从实现角度看,它倒是第一个支持高度交互式的解释 型程序设计风格的实用工具。目前,BASIC主要用作教学工具。在我国,主要用在中小学生、 高等专科学生与师范学生等的教学中。

在程序设计语言发展初期的十来年中,人们对语言研究的注意力主要放在新语言成分及 拥有新的语言成分的语言上,而极少从软件开发及程序设计方法的角度来设计语言。因此在 那时所设计的语言中有许多从现在的观点看一无是处。但不管怎么说,那时所研制的许多语 言在目前仍被人们研究着、使用着,在程序设计语言的发展史上也是值得大书特书的。

五、结构程序设计时期

1968年E.W.Dijkstra给COMM.ACM杂志编缉写了一封信,指出了语言中转向语句使用上带 来的问题,从而引发了程序设计语言中要不要使用转向语句的讨论,这场讨论使人们开始注 重对程序设计方法进行研究,从而导致了结构程序设计这一新的程序设计方法问世。但在最 初,人们一直认为结构程序设计就是不用或少用转向语句的程序设计,因此这一技术在语言 研究中的反映就是研究用于代替转向语句的程序结构与语言成分。为此人们研制了各种各 样的语句结构,主要是各种条件结构与循环结构。Dijkstra曾证明,任何程序都可以只用顺 序、选择、循环这三种结构的语句来构造,任何(包含转向语句的)程序都可以转换成等价的 只包含这三种语句的程序。这三种控制结构因此而被称为是D-结构(还有另一种扩充的 结构叫做DREC-结构)。1974年D.Knuth在一篇文章中指出,转向语句与结构程序设计之间没 有本 质的对立,在使用结构程序设计技术时可以运用转向语句,因此可以在语言成分中仍保 留转向语句,在功能上不加控制,但应限制其应用范围。

虽然现在大多数语言中都保留了转向语句,但其功能与结构却得到了大大简化。在高级 语言刚刚问世的时候,由于高级语言刚由低语言脱胎出来,而低级语言中的主要控制结构是 转移指令,因此那时的高级语句中对转向语句的设计都比较重视,这才出现了ALGOL60中的开 关说明与FORTRAN中的多种转向语句。而如今,随着人们对程序设计本质的认识越来越深入, 转向语句的形式与功能都变得很简单,只用于辅助其它控制结构。另外,从这一段时期开始 问世的各个语言的其它控制结构也变得简单了,比较有名的语言有Pascal、Modula、 Modula-2、BLISS、Euclid、Edison、Gypsy、CLU、XCY-2、SMALLTALK、C.Ada等。

1.Pascal语言

N.Wirth一直主张程序设计语言应精致简明,他在参与ALGOL68研制时就对之持不同意见, 他在研制了ALGOL-W与Euler之后又推出了一个全新的语言Pascal。Wirth研制这个语言的 目的旨在设计一种用于教学与编写系统软件的简明的语言。Pascal最定义与实现于1971年, 1973年对之修了修改并重新实现,但它直到70年代末才得到人们的广泛重视。目前,Pascal 已广泛用在教学与各种软件研制中,ISO和包括我国在内的许多国家都制定了Pascal标准。 Pascal除了吸收了ALGOL60的许多有益成分外,也采用了ALGOL-W的WHILE与CASE语句结 构、ALGOL68的用户定义数据类型等有益成分。它极大地支持着结构程序设计思想,其以用 户定义数据类型为基础的数据结构构造设施使数据抽象进入了一个新的层次,其后的Pascal 公理语义引起了人们对Pascal的更大关注。Pascal也有一些问题,如部分歧义性问题、指 针问题、动态数组问题等。

N.Wirth在完成了Pascal的设计与实现之后不久又开始了支持多道程序设计与模块化程 序设计的有关语言机制的研究,并在70年代后期研制出了Modula语言,后来又发展成Modula-2 语言。Modula-2几乎体现了Pascal的所有思想与设施并增加了模块设施。Wirth后来又研 制了一个新的更简明的语言Oberon,对Modula-2的记录类型机制等作了扩充和大量裁剪。

2.Ada语言

到了结构程序设计语言发展的巅峰,DOD推出了Ada语言。Ada的设计是雄心勃勃的,它以 可靠性、可维护性(可读性)、高效率等作为设计目标,试图集当代过程性程序设计语言的优 秀思想之大成,研制成一种在三军通用的标准程序设计语言。它的主要应用领域是嵌入式系 统,嵌入式系统具有可靠性要求高、规模大、复杂性高、费用高、使用周期长等特点。 Ada是用工程化方法开发出来的。在70年代中后期,DOD为研制这样一个语言专门成立了 一个高级语言工作组(HOLOG),HOLWG提出了草人、木人、锡人、铁人、钢人等一系列的逐步 完善的语言设计要求。在广泛招标的基础上,法国J.D.Ichbiah中标。Ada几经修改后于 1983年正式成为美军用标准语言。

Ada是在Pascal的基础上研制出来的,它在Pascal基础上增加、扩充了数值计算、 输入/输出、数据抽象、并发处理、实时处理、异常处理以及与机器有关的设施。它集中体 现了软件工程学、程序设计语言学、程序设计方法学的优秀研究成果,能大力支持程序模块 性、可移植性、可扩充性、抽象与信息隐藏,有助于高效的开发与维护程序。但Ada也受到 了以C.A.R.Hoare为代表的一些软件专家的指责,主要问题是Ada过于庞大、过于复杂。但不 管如何,DOD支持Ada的决心一直未变,而且它也在一些应用中得到了很大的好处。 Ada在发展着,新近推出的Ada-9x对Ada作了面向对象的扩充,主要扩充的内容有:支持对 象与类的机制、类库、并发处理机制等。Ada可望在今后若干年内仍是主要的软件开发语言。

3.C语言

在结构程序设计时期,由于软件工程强调抽象,这个时期推出的语言越来越"高级",越来 越抽象。但与此同时,一个并不高级也并不很抽象的语言却脱颖而出,这便是C语言。C是作 为系统程序设计语言于1973年研制出来的。C的成功得益于它有一个好的机会;那时的高级 语言基本都不适合开发系统软件,系统软件基本都是用机器语言或汇编语言编写的,而C的许 多类汇编语言特征却使它大获成功。C语言的表达式比较简洁、具体丰富的运算符,有比较 现代的控制结构与数据结构,它不是一个大语言,也不是一个很高级的语言(只能算一个中 级语言),它目前的应用范围已不限于系统软件开发,已成为目前最流行的语言之一。C语言 的主要不足在于它并没有完全体出好的程序设计思想。在使用C时可能会走入歧途。C由于 过于注重开发与运行效率而使其程序的可读性较差。

六、第四代语言

第四代语言(4GL)是与第三代语言及其它新型设计语言同时发展的,它与前三代语言的 主要区别是,它侧重于描述程序"做什么"而不是"如何做",函数式语言与逻辑式语言均有此 特征,而高级语言与低级语言相比,也显现出一些这种特征。第四代语言主要有如下三种:

·数据库及查询语言;

·应用生成程序;

可执行规格说明语言。但目前以前两种最为重要。随着诸如数据库系统、电子表格软 件、统计软件包及其它(专用)软件包越来越多的使用,非专业人员就需要使用一种用于对它 们进行管理控制的媒介,这便是第四代语言。严格地讲,第四代语言实际上并不只是语言,而 是一个交互式程序设计环境。

SQL是最著名的数据库查询语言,它是IBM公司开发的一种关系数据库查询语言。程序生 成程序或应用生成程序一般都基于某种特定的规格说明方法并能按一定的规格说明产生相 应的输出(如高级语言程序)。目前已有大量第四代语言问世,如ADF、IDEAL、NATURAL、 NOMAD、MANTIS、MAPPER、RAMIS等。

七、多范型程序设计语言时期

在高级程序设计语言问世以后的几十年内,尽管在60年代问世了LISP、APL与SNOBOL4等 非过程式(非强制式)程序设计语言,但仍然是过程性语言的天下。但自从J.Backus在1978年 图灵奖获奖讲演中指出了传统过程性语言的不足之后,人们开始把注意力转向研究其它风格、 其它范型的程序设计语言。目前已被人们研究或应用的非过程式语言范型主要有:函数式 语言、逻辑式语言、面向对象式语言与关系式语言等几种。

1.函数式语言

函数式语言也叫作用式语言。纯函数式语言中不使用赋值语句,其语法形式很类似于数 学上的函数,故得名。典型的函数式语言有LISP、APL与ML等。

2.逻辑式语言

逻辑式语言也叫说明式语言、基于规则式语言,以逻辑程序设计思想为理论基础,其主 要核心是事实、规则与推理机制。事实与规则用于表示信息(知识),而推理机制则用于根据 事实与规则产生执行结果。程序中不需要显式定义控制结构。其中最有代表性的逻辑式语 言是PROLOG。PROLOG是由法国马塞大学人工智能研究室的Roussel、Colmerauer与英国爱丁 堡大学人工智能系的Kowalsik合作于70年代初期研制出来的。自1981年日本政府宣布第五 代计算机系统(FGCS)项目以PROLOG为基础以来,PROLOG已成为人工智能研究领域的主导语言。

3.面向对象式语言

面向对象式语言简称对象式语言,它与传统过程性语言的主要区别在于:在传统过程性 语言中把数据以及处理它们的子程序当作互不相关的成分分别处理,而在对象式语言中则把 这两者统一作为对象封装一起进行处理。面向对象的思想是G.Booch在研究Ada软件开发方 法时首先提出来的,而对象式语言中的一个重要概念是类,类最早是在SIMULA67语言中提出 与实现的。但SIMULA67本身并不是一个面向对象的语言,而Ada也只是一个基于对象的语言。 完全面向对象的语言有SMALLTALK、C++、EIFFEL等。SMALLTALK是A.Kay于80年代初研制 出来的,他在研制这个语言之前已先期研制了FLEX语言。在SMALITALK中对象之间通过消息 进行通信,在一对象中向消息返回一个对象。

C++是在C的基础上扩充而成的,是C的超集。它在C的基础上扩充了类、对象、多继承、 运算符重载等面向对象的概念。EIFFEL是一个以可再用性与可扩充性作为其主要目标的对 象式语言,于80年代中期问世。EIFFEL是一个强类型语言,其主要成分是用于表示抽象数据 类型的类。面向对象的概念与语言目前尚不完全成熟,还处于进一步发展中。

随着各种范型的程序设计方法的研究,各种范型的相互渗透,目前许多语言都不止体现 了一种范型,如Modula.2、Ada等强制式语言中都体现了面向对象式范型的思想,而C++、 EIFFLE等对象式语言中则充满了强制式语言的思想;再如,LOGLISP与FUNLOG兼有函数式与逻辑 式范型的思想,LEAF与TABLOG兼有关系式与逻辑式范型的思想,LEAF与TABLOG兼有关系式与 逻辑式范型的思想,而LOOPS语言则把函数式、对象式、逻辑式与存取式多种范型有机地结 合在一起。在80年代中期问世的还有一个有名的多范型语言Nial,它支持强制式与函数式范 型,而新扩充的Nial版本还可以支持逻辑式与对象式范型。

由于每一种范型尽管有其长处但也有其局限性,现在程序设计语言的一大发展趋势就是 把各种范型的思想都尽可能融合在一个语言中,以支持不同要求、不同风格的程序设计应用。

八、结束语

本文对程序设计语言的发展过程进行了回顾,对各个时期问世的主要程序设计语言的背 景、特点、贡献及不足作了讨论。所讨论的语言中有不少都被进行了扩充(形成超集)、缩 减(形成子集)或既作扩充、缩减又作适当修改(形成方言)。例如,Pascal语言就有如下超集、 子集或方言(变种):Concurrent Pascal、Parallel Pascal、Pascal Plus、Pascal/R、 Pascal-SC、UCSD Pascal、Quick Pascal、MS Pascal、Objective Pascal等。 目前,各种风格、各种范型的程序设计语言都在发展着,其中尤以对象式语言的发展势 头最为迅猛。但是面向对象的语言不能解决所有问题,它们正在也应该吸收其它范型的长处, 成为以对象式范型为主、兼顾其它范型的新型语言。随着软件技术的发展,一定还会有新 的范型问世,相应的语言也会不断问世。一些具特定范型的成功的语言也会向其它范型扩充, 以增强其自身的生命力。

(计算机世界报 1995年 第13期)