程序设计语言诞生——程序设计语言的发展历史
程序设计语言诞生 1946冯·诺依曼提出了冯·诺依曼原理。
CPU逐条从存储器中取出指令执行,按指令取出存储的数据经运算后送回。
数据和指令(存储地址码、操作码)都统一按二进制编码输入。数据值的改变是重新赋值,即强行改变数据存储槽的内容,所以说它是命令式的(imperative)。
第一台按冯·诺依曼原理制成的通用电动计算机是1951年美国兰德公司的UNIVAC-1。人们就开始了机器语言的程序设计: 指定数据区编制一条条指令。由于任何人也无法记住并自如地编排二进制码(只有1和0的数字串),则用8、16进制数写程序,输入后是二进制的。
单调的数字极易出错,人们不堪其苦,想出了将操作码改作助记的字符,这就是汇编语言,汇编语言使编程方便得多。但汇编码编的程序必须要通过汇编程序翻译为机器码才能运行。尽管汇编码程序和机器码程序基本一一对应,但汇编语言出现说明两件事,一是开始了源代码——自动翻译器——目标代码的使用方式,一是计算机语言开始向宜人方向的进程。
50年代高级语言出现 1954年Backus根据1951年Rutishauser提出的用编译程序实现高级语言的思想,研究出第一个脱离机器的高级语言FORTRAN I。其编译程序用18个人一年完成(用汇编语言写)。到1957年的FORTRAN Ⅱ,它就比较完善了。它有变量、表达式、赋值、调用、输入/输出等概念;
有条件比较、顺序、选择、循环控制概念;
有满足科技计算的整、实数、复数和数组,以及为保证运算精度的双精度等数据类型。表达式采用代数模型。
FORTRAN的出现使当时科技计算为主的软件生产提高了一个数量级,奠定了高级语言的地位。FORTRAN也成为计算机语言界的英语式世界语。
1958年欧洲计算机科学家的一个组织GAMM和美国计算机协会ACM的专家在苏黎士会晤起草了一个“国际代数语言IAL”的报告,随后这个委员会研制了ALGOL 58得到广泛支持和响应。1960年欧美科学家再度在巴黎会晤对ALGOL 58进行了补充,这就是众所周知的ALGOL 60。1962年罗马会议上对ALGOL 60再次修订并发表了对“算法语言ALGOL 60修订的报告”。由于该报告对ALGOL 60定义采用相对严格的形式语法。ALGOL语言为广大计算机工作者接受,特别在欧洲。在美国,IBM公司当时经营世界计算机总额75%的销售量,一心要推行FORTRAN,不支持ALOGL,以致ALGOL 60始终没有大发展起来。尽管如此,ALGOL 60还是在程序设计语言发展史上是一个重要的里程碑。
1959年为了开发在商用事务处理方面的程序设计语言,美国各厂商和机构组成一个委员会。在美国国防部支持下于1960年4月发表了数据处理的COBOL 60语言。开发者的目标要尽可能英语化,使没有计算机知识的老板们也能看得懂。所以像算术运算符+、*都用英文ADD、MULTIPLY。COBOL 60的控制结构比FORTRAN还要简单,但数据描述大大扩展了,除了表(相当于数组)还有纪录、文件等概念。COBOL 60虽然繁琐(即使一个空程序也要写150个符号),由于其优异的输入/出功能,报表、分类归并的方便快速,使它存活并牢固占领商用事务软件市场,直到今天在英语国家的商业领域还有一定的地位。
50年代计算机应用在科学计算和事务处理方面有了FORTRAN、COBOL,因而应用得到迅速发展。工程控制方面刚刚起步,仍是汇编语言的市场。1957年,美国MIT科学家McCarthy提出LISP,并把它用于数学定理验证等较为智能性的程序上。但LISP在当时只是科学家的语言,没有进入软件市场。
60年代奠基性研究 60年代计算机硬件转入集成电路成本大幅度下降。应用普及的障碍是语言及软件。这就促使对编译技术的研究。编译技术的完善表现在大型语言、多种流派语言的出现。
1962年哈佛大学的K. Iverson提出APL语言。它是面向数学(矩阵)的语言。它定义了一套古怪的符号,联机使用非常简洁,深得数学家喜爱。它提出动态数据(向量)的概念。
1962年AT&T公司贝尔试验室R.Griswold提出正文处理的SNOBOL,可以处理代数公式、语法、正文、自然语言。以后发展为SNOBOL 3,SNOBOL 4。80年代后裔叫ICON,用于测试。
1963-64年美国IBM公司组织了一个委员会试图研制一个功能齐全的大型语言。希望它兼有FORTRAN和COBOL的功能,有类似ALGOL 60完善的定义及控制结构,名字就叫程序设计语言PL/1。程序员可控制程序发生异常情况的异常处理、并行处理、中断处理、存储控制等。所以它的外号叫“大型公共汽车”。它是大型通用语言的第一次尝试,提出了许多有益的新概念、新特征。但终因过于复杂、数据类型自动转换太灵活、可靠性差、低效,它没有普及起来。但IBM公司直到80年代在它的机器上还配备PL/I。
1967年为普及程序语言教育,美国达特茅斯学院的J.G. Kemeny和T.E.Kurtz研制出交互式、解释型语言BASIC(“初学者通用符号指令码”字头)。由于解释程序小(仅8K)赶上70年代微机大普及,BASIC取得众所周知的成就。但是它的弱类型、全程量数据、无模块,决定了它只能编制小程序。它是程序员入门的启蒙语言。
LOGO语言是美国MIT的S. Papert教授于1967年开发的小型语言。其目的是无数学基础的青少年也能学习使用计算机,理解程序设计思想,自己编制过程或程序。但直到80年代初微机普及到家庭它才受到重视。LOGO是交互式语言,用户编程就在终端前定义过程命令,并利用系统提供的命令构成程序。LOGO的数据是数、字、表。由于它能方便地处理符号表,可以利用人工智能成果开发情报检索、演绎推理、自然语言会话小程序。青少年可设计各种智能游戏。屏幕上的海龟使青少年直观地构造各种图形。递归程序的表达能力使青少年可受到自动程序良好训练。1979年MIT LOGO小组推出Apple LOGO,及TI LOGO(德州仪器公司TI 99/4A机)。这两个版本最为普及。LOGO是青少年入门的启蒙语言。
【程序设计语言诞生——程序设计语言的发展历史】LOGO的近于自然语言的命令及海龟、键盘、程序、图形并用的使用风格,对以后的命令式语言、用户界面语言有一定的影响。
1967年挪威计算机科学家O.J. DahI等人研制出通用模拟语言SIMULA67。它以ALGOL 60为基础,为分层模拟离散事件提出了类(Class)的概念。类将数据和其上的操作集为一体,定义出类似类型的样板。以实例进入运算。这是抽象数据类型及对象的先声。
60年代软件发展史上出了所谓的“软件危机”。事情是由1962年美国金星探测卫星“水手二号”发射失败引起的。经多方测试在“水手一号”发射不出错的程序在“水手二号”出了问题。软件无法通过测试证明它是正确的。于是,许多计算机科学家转入对程序正确性证明的研究。这时,著名的荷兰科学家E. Dijkstra提出的“goto语句是有害的”著名论断,引起了一场大争论。从程序结构角度而言,滥用goto语句会使程序无法分析、难于测试、不易修改。这时也提出了全程变量带来的数据耦合效应、函数调用的副作用、类型隐含声明和自动转换所带来的难于控制的潜伏不安全因素等等过程语言中的一些致命性弱点。60年代对大型系统软件的需求大为增长(如编制较完善操作系统、大型军用系统),要求使用高级语言以解决生产率之需,加上高级语言使用以来积累的经验,加深了人们对软件本质、程序语言的理解。人们积极研制反映新理论的语言。
1964年,ALGOL工作组成员N. Wirth改进了ALGO 60,提出结构化的语言ALGOL W。由于它结构简洁、完美。ALGOL W成为软件教程中示例语言。1968年,他带着ALGOL W参加新一代ALGOL的研究委员会,即开发ALGOL 68的工作组。
ALGOL 68追求的目标也是能在多个领域使用的大型通用语言。1965年以Wijngaarden为首的一批科学家开始研究新ALGOL。强调了语言设计中冗余性(少作隐含约定)、抽象性(数据抽象与控制抽象)、正交性(一个语言机制只在一处定义并与其它机制无关)。强化了类型定义和显式转换;
有并发、异常处理功能;
保留goto允许有限制的函数边界效应: 过程可以作为参数传递;
用户可定义较复杂数据结构、定义运算符。语法定义是半英语半形式化的。语言作成可扩充式,也就是说,有一个相对完备的小语言核心,可以不断增加新特征以增强语言表达能力。表达式采用利于快速编译和提高目标码效率的逆波兰表示法。ALGOL 68集中了当时语言和软件技术之大成。但因学究气太重,一般程序员难于掌握。强调语言简单的人持有不同看法。但文本草案在Wijngaarden坚持下通过了。为此,Dijkstra等人发表了“少数人声明”。N.Wirth带着竞争失败的ALGOL W回去研究以后著称于世的Pascal。Pascal的研制者一开始就本着“简单、有效、可靠”的原则设计语言。1971年Pascal正式问世后取得了巨大的成功。它只限于顺序程序设计。是结构化程序设计教育示范语言。
Pascal有完全结构化的控制结构。为了方便,除三种最基本的控制结构(顺序、if-then=else、while-do)外,又扩充了二种(do-until、for-do)。程序模块有子程序(过程和函数),分程序,可任意嵌套,因而有全程量、局部量、作用域与可见性概念。保留goto语句但不推荐使用。
Pascal的数据类型大大丰富了,有整、实、字符、布尔等纯量类型: 有数组、记录、变体记录、串等结构类型;
增加了集合、枚举、指针类型。为用户描述复杂的数据结构乃至动态数据提供了方便。所有进入程序的数据都要显式声明、显式类型转换。并加强了编译时刻类型检查、函数的显式的值参和变量参数定义便于限制边界效应。在人们为摆脱软件危机而对结构化程序设计寄于极大希望的时代,Pascal得到很快的普及。它也是对以后程序语言有较大影响的里程碑式的语言。
70年代完善的软件工程工具 硬件继续降价,功能、可靠性反而进一步提高。人们对软件的要求,无论是规模、功能、还是开发效率都大为提高了。仅管Pascal得到普遍好评,但它只能描述顺序的小程序,功能太弱。在大型、并发、实时程序设计中无能为力。程序越大越要求高的抽象力、安全性、积少成多的模块拼合功能。为了对付日益加剧的新意义上的软件危机。70年代语言继续发展,在总结PL/1和ALGOL 68失败的基础上,研制大型功能齐全的语言又一次掀起高潮。
70年代是微机大发展的时代。设计精巧的小型过程语言藉微机普及得到发展。软件市场FORTRAN、COBOL、汇编的三分天下开始缓慢地退却。结构化FORTRAN、COBOL力图在新的竞争中保全自己的地位,专用语言丛生。一旦证实它的普遍性,它就变为通用语言。C就是在这种情况下成长起来的优秀语言。
硬件的完善使得过去难以实施的组合爆炸算法得以缓解。人工智能的专家系统进入实用。LISP发展为INTEL LISP和MAC LISP两大分支,其他智能语言陆续推出。特别是Backus在1978年发表“程序设计能从冯·诺依曼风格中解放出来吗?”一文。非过程式语言、高抽象模式语言大量涌现。
70年代继60年代的形式语言语法研究,形式语义取得重大成果。最先是IBM维也纳实验室集合欧洲著名的计算机科学家于1972年写出PL/1的操作语义。该语义用维也纳定义语言VDL表达,长达1500页,终因抽象层次太低,而此时(1971年)牛津大学D.Scott和C.Strachey提出了更加数学化的指称语义学,维也纳实验室转而研究PL/1的指称语义描述。1973-1978年D. Bjorner和C. Jones开发了维也纳开发方法VDM。所用语言是Meta IV。虽然巨大投资(3.5亿)未见可见效益,IBM终止了维也纳实验室的语义学研究方向,但VDM方法及指称语言学对计算机语言发展影响是深远的。1973年C.Hoare和Wirth用指称语义写Pascal语义发现了Pascal的设计上的许多问题竟做不下去。VDM以后还用于多种语言如CHILL,Ada,指导编译器的开发。
1971-72年,DEC公司和卡内基﹒梅隆大学的Wulf合作,开发了PDP(以后是VAX)上的系统程序设计语言Bliss。它是无类型的结构化语言,没有goto语句。有异常处理和汇编接口,面向表达式。直到80年代末DEC公司还用它作系统设计。
1972年,AT&T公司贝尔实验室Ritchie开发了C语言。C语言的原型是1969年Richard开发的系统程序设计语BCPL。K.Thompson将BCPL改造成B语言,用于重写UNIX多用户操作系统。在PDP-11机的UNIX第五版时用的是将B改造后的C。C扩充了类型(B是无类型的)。1973年UNIX第五版90%左右的源程序是用C写的。它使UNIX成为世界上第一个易于移植的操作系统。UNIX以后发展成为良好的程序设计环境,反过来又促进了C的普及。
C语言是个小语言,追求程序简洁,编译运行效率高。是一个表达能力很强的、顺序的、结构化程序设计语言。它给程序员较大的自由度,下层数据转换灵活。程序正确性完全由程序员负责。上层是结构化的控制结构,有类似Pascal的数据类型。它的分别编译机制使它可构成大程序。输入/出依赖UNIX,使语言简短。语言学家极力反对的goto语句、无控制指针、函数边界效应、类型灵活转换、全程量这些不安全的根源C全部具备。在某种意义下C得益于灵活的指针、函数副作用和数据类型灵活的解释。易读性又不好,偏偏程序员都喜爱它。因为它简洁,近于硬件,代码高效,并有大量环境工具支持。C程序写起来又短,调试起来又快。微机上的各种移植版本的C语言,对C成为通用的程序设计语言起到了推波助澜的作用。C语言正以席卷系统程序设计领域的势头发展,并向应用领域扩展。以后的发展把与它同期出现的Pascal远远抛在后面,成为系统软件的主导语言。
1972年法国Marseille大学的P.Roussel研制出非过程的Prolog语言。Prolog有着完全崭新的程序设计风格,它只需要程序员声明“事实”“规则”。事实和规则都以一阶谓词的形式表示。Prolog规则的执行是靠该系统内部的推理机,而推理机按一定的次序执行。在这个意义上它又有点过程性。以回溯查找匹配,Prolog的数据结构类似Pascal的记录或LISP的表。它是以子句为基础的小语言,最初被解释执行,编译Prolog是很久以后的事,由于Prolog是以逻辑推理作为模型的语言,它可以直接映射客观世界事物间逻辑关系。在人工智能研究中得到了广泛的应用,80年代日本声称研制的五代机以Prolog作为主导语言并研制Prolog机。
70年代,在传统语言中出现了以下有代表性的语言:
为了开发大型可维护程序,施乐公司1972-74年由Geschke领导研制了Mesa语言。Mesa是强类型结构化语言,有模块(若干子程序集合)概念和抽象数据类型。支持并发程序设计,由监控器协调各模块执行。有分别编译,异常处理机制。保留goto语句,也可以抑制类型检查。Mesa可配置语言编译后的各模块。
1974年MIT的Liskov和Zilles提出CLU语言,它突出的是数据抽象。数据抽象是70年代类型强化和抽象技术的重要成果,它允许用户定义抽象的数据类型。这些类型的定义和它的实现可显式地分开。定义描述了语义,实现对于使用该数据的用户是无关紧要的,因而,利于修改。增强模块性和独立性,从而易于保证程序正确。数据抽象可定义更远离机器而近于人类的数据概念。如堆栈就可定义为抽象数据类型。人们可通过压入数据、弹出数据的操作对栈体进行操作。其外在行为就是后进先出的数据栈,而栈体可由数组、或链表、或记录任一种数据结构实现。
CLU的抽象数据类型称之为簇(Cluster)。由构造算子(Constructor按簇的样板建立运算对象(实例)。CLU无goto,无全程量概念。用户可定义新的迭代(通过迭代算子Iterator)。
数据抽象在1975年卡内基﹒梅降大学Wulf和Shaw开发的ALPHARD语言中是数据模型FORM。ALPHARD的特点是支持程序的验证。程序设计和验证同时进行。
另一个支持程序验证的语言是加州大学Poperk和加拿大的Horning于1976年到77年开发的EUCLID。为了易于验证,无goto语句,指针仅限于集合类型,类型兼容有严格的定义,函数调用绝无边界效应。编译自动生成验证用的断言。EUCLID以后发展成数据流语言。
在并发程序方面,1975年丹麦学者B.Hanson开发了并发Pascal。它没有追求大而全,只是将Pascal向并发方面作了扩充,希望用Pascal写操作系统。有抽象数据类型的类(Class)机制。控制方面提出进程类和管程类的概念。通过init语句激活类实例,cycle语句使进程无限循环地运行。通过管程(管理资源的模块)实现进程通讯。有较强的静态类型检查,可查出静态“死锁”。
令人不解的是正当人们对进程、管理概念充分评价时,B.Hanson本人放弃了这些概念。1981年发表了小型系统程序设计语言Edison,仅用并发语句控制并发进程的执行。Hanson极力推崇语言的简单性,所以Edison比并发Pascal小得多,普通(不大的)微机都可以运行。但其表达能力比C差多了。没有达到并发Pascal那样的影响。
Pascal在结构化程序设计方面是一个示范性语言,在推行结构化程序设计教学上发挥了卓越的作用,但在工程实践上暴露出设计上的许多缺点。Pascal除了无独立模块和分别编译机制不能编大程序而外,原来它的强类型是有漏洞的。类型等价似乎是按名等价,实现是按结构等价。最后的结论它是“伪强类型”。数组定长对处理字符串很不方便,布尔表达式求值定义不严,I/O规定太死,难于写出灵活的输入/输出。声明顺序过严,无静态变量概念(局部量一旦所在局部块执行完毕就消失)都给程序设计带来不便。从小而灵活方面,它又不及C,没有位(bit)级操作,指针操作限制过死。于是Pascal的设计者1975年又开始开发Modula语言,1977年正式发布为Modula-2。
Modula-2除了改进Pascal的上述弱点而外,最重要的是有模块结构。可分别编译的模块是用户程序的资源。系统资源也以模块形式出现。模块封装了数据和操作(过程),模块定义和模块实现显式分开。程序员在定义模块中通过移入,移出子句控制程序资源(类型、变量、过程、子模块)的使用。
Modula-2增加了同步进程机制以支持并发程序设计,有有限的低级设施直接和系统打交道。取消goto语句、增加case语句中otherwise机制,封装的模块可作抽象数据类型设计。它是用于系统设计的强类型语言。西欧的计算机科学家对Modula-2是欢迎的,但它不巧与美国开发的Ada非常近似,与Ada竞争处于非常不利的地位。尽管它的9000句编译器具有Ada20万句编译器80%的功能,也没有取得Pascal那样的成就。
70年代中期美国软件的最大用户美国国防部(美国软件市场约2/3经费直接或间接与它相关)深感软件费用激增并开始研究原因。研究结果表明,在硬件成本降低和可靠性提高的同时,软件费用不仅相对数,绝对数也在增加。美国军用的大量大型、实时、嵌入式系统软件开发方法落后、可靠性差。语言众多(常用400-500种,加上派生方言多达1500种)造成不可移植、难于维护,为摆脱这种新的软件危机下定决心搞统一的军用通用语言。从1975年成立高级语言工作组开始投资五亿美元,前后八年研制出Ada程序设计语言。Ada是在国际范围内投标设计的,法国的一家软件公司中标,J.Ichbian成为Ada发明人。多达1500名第一流软件专家参与了开发或评审。它反映了70年代末软件技术、软件工程水平。为了提高软件生产率和改善软件可移植性,提出开发语言的同时开发支持该语言的可移植环境(APSE)。
Ada是强类型结构化语言。封装的程序包是程序资源构件。用户只能看到程序包规格说明中显式定义的数据(包括抽象数据类型)和操作。数据结构和操作(过程或函数)的实现在程序包体中完成。封装支持模块性和可维护性。规格说明和体的分离支持早期开发(可延迟决策)。分别编译机制可组成复杂的大型软件。
Ada有并发、异常机制。可定义精确的数据(如浮点数小数点后任意多的位数)。有将数据对象、类型、过程参数化的类属机制。有为目标机写目标程序(机器语言的或汇编语言地)的低级设施,可对字节、字位操作。Ada的私有类型支持数据隐藏,程序包可实现数据抽象。标识符和运算符重载概念,既方便程序员又使程序好读且安全。强调大型系统可读性胜于可写性,Ada程序自成清晰的文档。
Ada语言的开发过程完全按软件工程方式进行。严格禁止方言。美国国防部有一个严格管理Ada及其环境的机构AJPO(Ada联合规划办公室)负责Ada的确认、修改、维护、培训。从业界转向软件工程方法开发软件的意义上,Ada也称之为里程碑式语言。
由于Ada过多强调安全性和易读性,Ada编译程序要做较多的静态检查,因而体积庞大(约20万句、512KB的微机装下了微机Ada编译就剩不下工作空间了)。程序代码较长,虽不像COBOL繁琐但要比C语言程序长60%。运行效率,特别是嵌入式实时控制应用中,通过交叉编译得到的目标机代码一时还难满足要求。环境工具发展缓慢,因为除军方外民间公司更乐于开发对所有语言通用的计算机辅助软件工程环境(CASE)。自80年代第一个语言版本,83年修改定型至今, Ada没有达到投资者预想的成就。目前已看到Ada83只反映80年代初期的软件工程技术。随着软件工程本身向集成化、可重用、面向对象方向发展,Ada已有一些不适应了。但美国军方还在全力支持,1995年Ada完成面向对象改造推出了Ada-95。增加了标签类型、类宽类型、抽象类型;放宽了访问类型;使一个静态强类型语言可以支持OO的动态束定。这种改造非常痛苦,使Ada-95语法规则增至277条,成为最庞大臃肿的语言。耐人寻味的是Ada-95很块被ANSI和ISO 接受,它成为世界上第一个有法定标准的面向对象的语言。
70年代末到80年代初值得一提的还有FORTH语言。FORTH是典型的中级语言。它是汇编语言指令码向用户自定义方向的发展。也就是说,用户可以面向一个堆栈机器模型定义操作命令——字(word)。最低层的字是指令码,逐层向上,上层字由下层组成。因此,FORTH系统有良好的继承性。系统提供核心字、解释器字、编译字和设备字。对于简单的计算解释器字直接执行命令(字),复杂计算可将字定义编译成目标码存入堆栈供以后执行。有汇编字集合以便用户直接使用机器,要求字集合操作数值计算,引用字集合使用户可以引用系统和用以前已定义的字。FORTH程序员首先查看系统中字的字典,以它们组合成新字,进而构成程序。FORTH程序的逆波兰表示法便利于解释和编译,这对长期从事汇编编程的程序员并不生疏。FORTH把具体的机器抽象为堆栈机,既可以使程序员直接操纵机器又不涉及具体机器指令码、操作码、存储安排。而且良好的继承性使程序越编越短,在最终用户层一两个命令就完成了程序设计。它大受控制领域、要求单片、单板计算机(例如仪表工业)领域的程序员喜爱。
FORTH是C.Moore一个人开发的语言,他于1968年在IBM 1130机器上实现第一个FORTH。他说他的语言是第四代的(Fourth-Generation)。由于1130只允许五个字符的名字才叫FORTH。1973年成立FORTH公司并把它投入航天工程应用,发展了通用商务FORTH系统。此后世界各地开始重视FORTH。1976年成立欧洲FORTH用户小组(EFUG),1978年成立FORTH标准化国际组织,80年发布FORTH-79标准文本。与此同时美国FORTH爱好者小组FIG)也制定了标准fig FORTH。各国天文行业,仪表行业纷纷以其为行业用计算机语言。FORTH并不好读,也不宜编大程序。但在它自己的领域简单好用、扩充方便、编译迅速。与传统语言追求的目标大相径庭。给人耳目一新。
80年代的面向对象发展 Ada的大、功能齐全、开发耗资可以说是程序设计语言之最。但它还没有普及就有些落伍了。可能今后不再有人再投入巨资去开发大型过程语言。
80年代继续向软件危机开战,但软件工程以陈旧技术难于作出庞杂的软件工具。为了改善这种情况,人们乞灵于面向对象技术。程序设计语言纷纷面向对象靠拢。正如上一个10年程序设计语言结构化一样。这是主要特点。
80年代的第二个特点是“用户友好”的所谓第四代语言的出现。
80年代的第三个特点是各种技术相互渗透各种更高级非过程性语言出现。
1972年美国施乐公司保罗·奥特研究中心的A.Kay领导的软件概念小组为方便不同用户处理各种信息在小机器上搞了一个Dynabook计划。它以全部的“对象”概念建立自己的系统。1980年Smalltalk-80作为正式的发布版本。
Smalltalk语言是该系统的软件。专用的硬件机、Smalltalk环境、用户界面、面向对象程序设计风格构成了整个系统。
“对象”是有自己的数据和操作的实体,各对象相对封闭。程序设计就是建立应用系统中的对象群,并使之相互发消息。接到消息的对象就在自己封闭的存储中响应执行操作。操作的结果是改变这组对象的状态、完成计算(发出输出消息,对象响应后完成输出)。
为了使各自封闭的对象数据和操作不致多次重复定义。Smalltalk有类和继承的概念。类如同传统语言中的类型,只有类的实例进入实际运算(叫实例对象)。类对象中的数据和操作可为它的子类继承,它自己的数据和操作也继承自超类。于是一个Smalltalk系统就必须有支持它的一个类库,它象一棵大树,所有的行之有效类都在这棵大树的某个位置上。用户只要选取其中某些类稍加修改变成自己问题所需要的类(子类),定出通讯协议,让它们的实例相互通讯完成计算。无论是系统对象和用户定义的对象都按不同的抽象层次放在统一的类库中。例如,向编译对象发消息并传送用户对象,该用户对象(程序)就被编译了。Smalltalk中只有不同抽象层次的对象,小到一个整数、大到一个系统都叫对象,且别无其它计算单元。面向对象程序设计的概念因此而出。
Smalltalk因为它天然的封装性体现了模块性和数据隐藏,利于维护修改。它的继承性实质上是软件的重用。这对困惑于大程序难于管理的软件工程学无疑是一条绝好出路。
Smalltalk类对象概念来自SIMULA 67,响应消息的方法表达式求值类似LISP的归约。它本身是在小机器上开发的小系统。庞大的类库占去了很大的空间,难于编制大型程序。加上它独特的编程风格,Smalltalk本身并未发展起来。但面向对象思想,语言和环境一致性;
交互式和极端用户友好(用菜单和鼠标即可上机),对80年代语言和计算系统产生了巨大影响。它也可称之里程碑式的语言。
各种过程语言,甚至汇编语言都借鉴对象思想,以求能支持面向对象程序设计。82-86年相继出现Object Pascal、Objective-C、Objext Assembler(68000汇编程序改造)。Object、LOGO、Object FROTH它们以原有语言采纳对象——消息编程模式。
另一些语言向类、对象延伸。以对象——引用编程模式编程。如85年AT&T公司推出的C++。87年Borland公司的Turbo Pascal 5.5。
传统的人工智能语言也向面向对象上发展。施乐公司1983年在Intel LISP基础上研制了LOOPS。是面向对象LISP美国西海岸版本。85年美国符号处理公司在MIT的LISP机上开发了Flavos,称之为东海岸版本。Flavos有更为灵活和复杂的多继承性。85年施乐公司又作出Common LOOPS。1988年,ANSI X3J13组将它们统一为CLOS。85年,IBM日本分公司开发了SPOOL是Prolog面向对象的扩充。86年Valcan和施乐联合开发的并发Prolog预处理程序,也是支持面向对象的。
70年代在软件发展史上是数据库成熟的年代。数据库有数据描述语言DDL数据操作语言DML。它们都是为实现某种模式数据库的专用语言。目标简单,在所应用的领域高效。因此,不能以通用程序设计语言代替。数据库给用户以界面(即查询)语言。对于简单程序没有必要转到通用语言再编程序。查询语言进一步扩充,就形成一系列查询命令加上约束条件控制的非过程语言。如SQL。1988年SQL成为正式ANSI/ISO标准。
80年代软件环境大发展。操作系统原有的作业控制语言(JCL)和系统调用命令也逐步发展为该环境的统一的界面语言。如UNIX的Shell。
80年代系统软件中开发环境的思想向各专业渗透。各专业都为本专业的最终用户提供简便的开发环境。即事先将程序模块以目标码存放计算机,用户只需简单的命令,甚至本专业常用的图形就可组成应用程序。这些图形、菜单、命令即用户界面语言。
这些语言共同的特点是声明性(只需指明要做的事)、非过程性、简单、用户友好。而应用程序的实现可由系统自己完成(低层有固定不变的计算模型,如关系运算,也可以连接备用模块智能推理)。这就所谓的第四代语言(4GL)。
4GL并没有为程序设计语言学带来什么新概念和新特征。一般用传统技术做出界面语言解释器。要求环境有较好的工具支持(应用程序、程序库、各种测试、调试、文档工具)。最简单的4GL是图形——菜单,用户不用击键即可完成计算(用鼠标器)。
4GL是硬件高速发展和快速降价必然的结果。因为不可能在短期内培养出与硬件发展需要出匹配的那么多的程序员。但4GL不易编制开创性程序。
九十年代网络计算语言 九十年代计算机硬件发展速度依然不减。每片芯片上晶体管数目仍然是一年半增加一倍。计算机主频从12-25兆赫增加到500-600兆赫(每秒钟可执行750MIPS指令),价格进一步低廉。使用方式也从多人一机的分时系统到一人一机局域网计算,到每人都成为拥有全球资源的客户。建立在异质网上的多媒体环境已成为客户端使用环境的主流。支持“所见即所得”的用户界面的“语言”大量涌现。
由于有良好环境支持,程序设计重点从算法加数据结构实现技术向规模说明描述方面转移。规模说明语言在80年代已有研究。(META-IV,EPROL,HOPE,CLEAR、SPECINT,Z)在个别具体领域也能实用。但作为通用,哪怕是某个行业建立在域分析基础上的规格说明语言尚未出现。
环境智能化、规模说明语言自动生成目标码客观上要求加入人工智能技术。异质网环境推行后各结点上数据库资源共享都要求各语言间不要有人为的断层。因此,多范型语言研究会有较大发展。80年代向面向对象扩充已经出现多范型语言,如C++,Ada 95(命令式加对象式)、CLOS(函数式加对象式0。为外小型研究有TABLOG(关系式加逻辑式)、Funlog(函数式加逻辑式)值得注意的是加拿大的Nial(1983-88)和美国的G(1986)语言,它们试图将五种范型: 命令式+对象式+逻辑式+函数式+关系式统一在一个语言之中。虽然问题重重,但可由此发现许多新概念和新特征,对于程序设计语言研究是非常有利的。
随着面向对象数据库和面向对象操作系统的成熟,完全消灭“语义断层”的数据库程序设计语言(DBPL)和持久性程序设计语言(PPL)终将汇合并标准化。这样,程序运行时大量文件到内存转换则可以取消,从而增大了计算机的实崐时性,甚至取消文件概念。
4GL有了较大发展,种类花色增多,行业标准出现。支持它们的通用程序设计语言是C、C++、Ada。
转自:程序设计语言的诞生
推荐阅读
- 历史上的今天|【历史上的今天】4 月 9 日(谷歌输入法致歉搜狐;UNIVAC 和 ENIAC 的发明者诞生;德国电脑业领军人出生)
- Python中的七个小技巧
- c语言实现strcat函数
- C语言|C语言的内存操作函数
- c语言中各种函数的作用,C语言常用函数用法大全
- C|【C语言的灵魂】-指针(2)
- c语言的拷贝函数,利用C语言中的函数实现文件的Copy
- C|C语言的灵魂-指针(1)
- C|初识C语言(2)-常量,字符串+转义字符,ASCII码,选择语句,循环语句,函数,数组,操作符
- 编程语言_JAVA|Netty实战-如何在web项目中对接第三方tcp协议