程序设计语⾔诞⽣——程序设计语⾔的发展历史
程序设计语⾔诞⽣
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。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。