1.4 程序设计语言发展简介
程序设计语言在短短的50余年里发生了很大的变化,得到了很大的发展。风格迥异的上千种语言成为开发计算机软件的强有力工具。
从今天软件开发过程的观点来看,最早的软件开发仅有编码阶段。早期的计算机仅用于科学计算,其特点是:计算复杂,数据量少。那时一个任务完全可以由一个人完成程序的编写并由计算机加以实现。程序员所求解的问题(例如微分方程求解)都是他能理解的问题,他只需从数学家那里找到相应的数学求解算法就可以编程实现,没有必要进行需求分析或设计规范说明,其程序的维护也非常简单,只需要改正一些编程错误。当时的语言着眼于支持程序员个人,按照今天的观点来说,程序员所进行的工作仅仅是简单的应用。
随着计算机技术的发展,人们期望计算机的应用更加广泛,求解任务变得越来越复杂,计算机处于一个难于理解和更加复杂的环境之中。这时只靠程序员个人在头脑中进行需求分析和设计已不适应复杂任务的要求,它需要一个程序员“队伍”来共同进行需求分析和设计,并协同工作来完成预定的任务。另外,开发一个大系统需要花费大量的人力和物力,所以在建立新系统时,出于经济上的考虑,也不能完全把旧系统抛开,而是将它修改、补充和完善,以满足新的要求。因而程序的可维护性(Maintainability)就成为一个重要的现实问题。
随着系统变得越来越庞大,越来越复杂,系统的可靠性(Reliability)也成为另一个重要的现实问题。例如,若把一个不可靠的系统用来控制核电站,可能出现灾难性的后果。
除此之外,程序设计语言一般是针对某类计算机应用而设计的,在使用过程中可能发现它的不足(局限性),或者需要对其提出更高的要求并扩充其应用能力,这需要设计新的语言来适应这种变化,程序设计语言也由此得到发展。
在此我们关注的是高级程序设计语言,下面将沿着上述发展过程展开讨论。由于篇幅的限制,讨论中将只涉及到那些对程序设计产生过一定影响的高级程序设计语言。
1.4.1 早期的高级语言
第一个高级语言要追溯到20世纪50年代,那时计算机非常昂贵而又稀少,有效地使用计算机是人们重视的问题。另一方面,机器的执行效率也是人们追求的目标。为此人们设计了高级语言,用以方便地表达用户的需求。然而高级语言程序只有经过编译,机器才能执行,而编译要占去一部分机器时间。更为严重的是,在当时编译生成的目标程序的执行效率要低于人工直接编制的程序的执行效率。因此,那时设计的高级语言以冯·诺依曼模型为基础,并且特别强调执行效率。实践证明,高级语言是有效地使用机器与机器执行效率之间的一个很好的折中。
这一历史时期最重要而又最具代表性的语言是FORTRAN(FORmula TRANslation),ALGOL 60(ALGOrithmic Language 60)和COBOL(COmmon Business Oriented Language)。使用这些语言可以用接近人们习惯的语言编制程序,大大提高了机器的使用效率。
1.FORTRAN语言
FORTRAN是1954年设计并于1957年在IBM 704机上实现的第一个高级语言。1958年又实现了FORTRAN Ⅱ,其后不久实现了FORTRAN Ⅲ,几年之后出现FORTRAN Ⅳ。1966年,美国标准协会(American Standards Association)公布了ASA FORTRAN,后来又产生了FORTRAN 77和FORTRAN 90,今天,已经有了FORTRAN 2003和FORTRAN 2007。
FORTRAN语言完成了第一个编译器,它的文本编辑器用于程序的创建。FORTRAN语言将主程序、子程序和函数看成独立的模块进行编译,它没有递归调用。各个模块先要编译成可执行形式,再通过连接器(Linker)将主程序、子程序、函数和运行库连接成一个可执行程序,然后按照控制流程(执行步骤)执行这个可执行程序。
FORTRAN是典型的强调执行效率的语言,它结构简单,不强调程序设计技巧,达到了提高执行效率的目标。
FORTRAN语言主要用于科学计算。作为数值计算工具,它特别适合解决数据量少而计算复杂的问题。它提供4种数值型数据类型(整数类型、实数类型、复数类型和双精度实数类型)及布尔数据(逻辑类型)、数组、字符串和文件等数据类型,这些类型使得它可以在编译时静态分配存储空间。FORTRAN语言中引入了最原始的语言概念,如将变量作为存储单元的抽象,语句顺序执行,goto语句强制改变语句的执行顺序,通过全局(COMMON)环境共享数据对象(实现模块之间的通信)等。语法采用自然语言(英语)描述。
随着计算机的发展,FORTRAN语言已经吸取了许多后来出现的语言的优点,得到了很大的改进和发展。
2.ALGOL 60语言
由于FORTRAN语言的成功,使欧洲人担心IBM会统治业界,因此,德国应用数学协会GAMM组织了一个工作组来设计一种通用语言。在美国,计算机协会也组织了类似的工作组,后来两个工作组合并,在彼得·诺尔(Peter Naur)的领导下开发出国际算法语言IAL,并在1958年以ALGOL 58命名,1960年公布了著名的算法语言ALGOL 60,1963年公布了ALGOL 60的修订版。
ALGOL 60语言在美国商业界未能取得成功应用,因为美国商业界已经习惯了应用FORTRAN语言,但它在欧洲还是取得了一些成就。
巴科斯(Backus)是定义ALGOL报告的编辑,他用乔姆斯基(Chomsky)开发的文法(Grammar,参见4.2节)分类中的上下文无关文法来描述ALGOL语言的文法,成功地将形式语言理论引入程序设计语言中,后来大多数高级语言都采用这种方法来定义文法。ALGOL 60报告是以诺尔名义发表的。由于巴科斯和诺尔在发展ALGOL中所起的巨大作用,这一方法被称为巴科斯-诺尔范式(BNF)。这种形式语言描述方法为语言定义开辟了新纪元,提供了精确的语法定义方法,从而减少了用自然语言说明的二义性,使得编程的语法错误大为减少。有趣的是,科学家们在严密定义ALGOL 60的语法和成分时,竟忽略了“程序”的定义,这个疏忽在ALGOL 60正式公布之后才被发现,并在1963年的修订版中补充定义。ALGOL 60引入了分程序(Block)结构、递归过程和动态组等新概念。
3.COBOL语言
1959年,美国国防部为了开发一种通用的商业语言(CBL)召开了一个专门会议,希望该语言尽量使用自然语言(英语)。会上意见分歧较大,会后专门组织了一个短期协会(Short Range Committee)来快速开发这一语言。1960年,公布了命名为COBOL的商用语言,完成了编译实现,并于1961年和1962年进行了修订。1968年公布了ANSI标准,1974年又公布了ANSI新标准。
由于COBOL语言使用近似于自然语言的方式编程,其可读性比较强,但它还是保留了形式语法,程序员不经过专门培训要完成编程还是比较困难的。COBOL语言使用了大量不同的数据表示,以及语句中包含大量的不同变体选择,编译工作是相当复杂的。早期的编译器执行起来都很慢,但随着编译技术的发展,新近开发的编译器速度较快,产生的目标程序执行起来也更加有效。
COBOL语言成功地将若干新概念引入程序设计语言中,除了上面提到的类自然语言编程外,还引入了文件和数据描述、变体记录等概念。
COBOL语言的出现,打破了计算机应用领域仅限于科学数值计算的局面,开始应用于各种事务处理领域,特别是数据处理(计算简单、数据量特别大)领域,为计算机的应用和发展开辟了新纪元。COBOL语言一直用得很好,我国早些年引进的应用软件,大多数是用COBOL语言开发的,只是后来才被C语言和其他一些语言所代替。
1.4.2 早期语言的发展阶段
随着计算机的发展和应用的日益广泛,实现的效率已经不再是人们唯一的追求目标。早在20世纪60年代就出现了一些基于数学原则的机器计算表示法语言,它们基于数学函数和函数作用,而不是基于冯·诺依曼模型的。这些语言的代表是LISP,APL(A Programming Language)和SNOBOL4。
1.LISP语言
1960年,John Mc Carthy在麻省理工学院(MIT)设计和实现了LISP语言,它的设计基于函数和函数作用的数学概念,它奠定了函数式(或作用式)语言风格的基础。由于没有适用于函数式语言的计算机体系结构问世,因此它不得不在冯·诺依曼体系结构的计算机上执行,其执行效率低,执行速度慢。
通常,LISP程序不经过编译而是通过解释来执行。人们为了提高执行速度,各种实现对LISP进行了不同的改造,出现了许多不同的版本。1981年4月,各个不同的LISP学派召开了一次会议,试图将各种版本统一起来,于是出现了通用LlSP(Common LISP)语言。
由于LISP语言特有的数学特性,使它一出现就在计算机科学的研究中得到大量应用,特别是在人工智能领域。例如,在机器人、自然语言理解、定理证明和智能系统等研究领域应用非常广泛。
纯LISP语言从变量值可以被修改、赋值语句、goto语句等冯·诺依曼体系结构概念中解放出来。它主要用来处理符号表达式,并引入了许多新概念。例如,语言有统一的数据结构(表);数据和程序有统一的表示方法(S表达式),其中包括递归表达式、前缀表达式,并将递归作为基本控制结构等。LISP语言的语义很容易用LISP程序描述,用LISP语言编写的函数EVAL,可用来计算任何给定的LISP表达式,它是LISP语言的语义定义。
2.APL语言
20世纪60年代,由柯沃尔森研制并实现了APL语言。APL语言表达式简洁,操作符丰富,采用非标准字符集,程序具有单行(One-Liner)结构特点(参看1.2.4节)。
APL语言最大的特点是对矩阵的运算能力,其所有的操作都作用在向量或矩阵上,它用附加的操作来建立特殊的向量,例如对向量的所有元素进行设置和定值。APL语言中没有操作优先级,语句从左到右执行。这种矩阵运算操作符能使程序员从低级重复的、逐个操纵矩阵元素的繁琐工作中解脱出来。
3.SNOBOL语言
SNOBOL语言是20世纪60年代初期公布的,后来又开发出SNOBOL 2和SNOBOL 3,到20世纪70年代又研制出SNOBOL 4。它是面向字符的符号语言,它的关键操作是模式匹配,即将一组变量与一个预先定义的模式相匹配,并通过将该组变量值赋给该模式来实现操作。
它的说明、类型定义、存储器分配,甚至过程的入口和出口均是动态的。其实现一般使用虚拟串来处理宏功能,在实际计算机的实现上只需重写宏定义,方便了程序移植。
SNOBOL语言专门用于字符串数据处理,其语句由定义在符号名字符串上的运算规则组成,基本运算包括字符处理、模式匹配和替换等。SNOBOL语言中提出了模式数据类型,为程序员定义数据类型提供了方便,并在串的处理方面达到较完善的水平。SNOBOL 4主要用于文本编辑、代数表达式的符号处理等领域。
LISP,APL和SNOBOL 4语言都是动态语言,它们是机器资源(时间和空间)的巨大耗费者,它们都要求高度动态的资源管理,因此很难在传统机器上有效地实现。然而,它们还是成功地应用于一些特定的领域。例如,LISP语言已成为一段时期内人工智能研究和应用的主要语言;APL语言广泛应用于涉及大量矩阵运算的科学计算领域;SNOBOL 4语言已成功地应用于文本处理。近年来,这些语言的原则在研究部门和工业部门已经受到广泛的关注。
LISP和SNOBOL 4在语言发展中的重要贡献是强调符号计算。早期的计算机应用主要强调数值问题求解,例如FORTRAN和ALGOL 60语言是为数值问题求解而设计的语言。虽然APL语言具有字符处理能力,但它主要还是用来进行矩阵运算。然而,数值计算仅仅是计算机应用的一个小分支,它的一个主要应用领域是符号信息处理,例如数据库查询、报表、文本处理和财务管理等。COBOL语言可以看成这个应用领域的代表,它不是通过复杂的计算来处理数据,而是面向格式化数据。在这些语言中,只有LISP和SNOBOL 4语言是涉及符号计算的语言。
1.4.3 概念的集成阶段
这一时期的代表语言是PL/1,1963年,IBM公司和它的用户提出设计一种比FOR-TRAN功能更强的语言。1964年在英格兰的Hursley实验室中开发出一种新的程序设计语言NPL(New Programming Language),后来更名为多用途程序设计语言MPPL。后经扩充,简化命名为PL/1,并在1966年正式完成PL/1语言的实现。
PL/l语言的设计目标(即面向的问题)不很明确,它希望将已有的语言概念集成在一起,成为一种通用的语言。它吸取了ALGOL 60语言的分程序概念和递归过程,COBOL语言的数据描述功能,LISP语言的动态数据结构等概念,它还提出了异常处理(ExcePtion Handling)和某些简单的多任务功能。PL/1语言可用于科学数值计算、数据处理和系统软件开发。显然,PL/1语言的功能比已有的语言更强大,所以它在20世纪60年代后期和70年代中期得到了广泛应用。
PL/1语言的另一个贡献是它的维也纳文本。它采用操作语义学形式描述语言,它作为一个成功的范例推动了形式语义学的研究,对理论研究做出了贡献。
PL/1语言设计者的初衷可能很好,然而在当时的历史条件下,语言理论尚不成熟,对语言的特性、概念和问题尚缺乏认真的研究和实践,在没有良好的理论基础和实践经验的情况下,机械地把众多语言的特性组合在一起,其生命力不会很长,到20世纪70年代中期就很少使用它了。
1.4.4 再一次突破
20世纪60年代后期设计的语言引入了很多有趣的概念,并且影响到后来的语言设计,最有代表性的语言是ALGOL 68,SIMULA 67和Pascal。
1968年,国际信息处理联合会IFIP(International Federation for Information Processing)以报告形式公布了一个ALGOL 60的后继语言ALGOL 68。它一问世就遭到一些人的非议。它的精确定义太复杂,即使对熟练的程序员,这个报告也太难读懂、太难掌握,甚至无法理解和实现。
ALGOL 68语言成功地将正交性(Orthogonality)和通用性原则应用到语言设计中。语言正交性原则使语言的性质以自由而又一致的方式组合,并且每种组合都是有意义的,可以预料其影响而又不受限制。例如,在语言定义的执行语句中,每个语句都要求产生一个值。AL-GOL 68语言还引入许多新概念,体现了不同语言概念对计算能力的影响。ALGOL 68为语言的形式描述做了艰辛的努力,它的维恩加登文法(Wij ngaarden Grammar)是首次严格描述完整语言的零型文法,这是一个重要贡献。ALGOL 68语言过早衰落的原因在于其太强调自身的“纯洁”性,正交组合语言性质导致错综复杂的关系,缺乏通俗和友好的面对用户的语法记号。它曾用于欧洲一些高校和研究所,很少用于工业部门,在我国鲜为人知。
SIMULA 67也是ALGOL 60的后继语言,是第一个用于模拟领域的语言。它是由挪威人Nygaard与Dahl开发的。他们把类(Class)引入ALGOL,使得Stroustrup在20世纪80年代后期产生了C++的类思想,并把它作为C语言的扩充。为了模拟领域应用,SlMULA 67语言增加了一个特殊结构——协同程序(Coroutine)。这个结构是过程的发展,两个协同子程序可以互相交错调用和多次进入,它是并行程序设计思想的萌芽。SIMULA 67类的概念可将数据结构和操作组合成一个模块,用以增强说明的层次性,奠定了抽象数据类型的基础。类的概念影响了SIMULA 67语言之后出现的大多数语言,如CLU,Modula 2,Ada和Smalltalk等。
Pascal语言是由沃斯(Niklaus Wirth)设计的。1965年,瑞士人沃斯在斯坦福大学开发一个ALGOL 60的扩展语言,它同时支持IBM 360的数据结构和指针,称为ALGOL W。1968年,沃斯回到瑞士开始设计ALGOL W的后继语言,他使用法国数学家Blaise Pascal的名字命名这个后继语言,即后来大家熟知的Pascal语言。经过广泛的研究之后,他将Pascal程序编译成一种中间代码(伪机器码)——P-code,然后对P-code解释执行。1970年,第一个编译程序正式运行,这就是著名的P-code解释器。通过产生中间代码,Pascal程序可以很方便地移植到其他的机器上执行。
Pascal语言的最初设计目标是作为结构化程序设计的教学语言。随着微型计算机的降价和广泛应用,到20世纪70年代后期,人们对它产生了极大的兴趣。它的吸引力在于,在不牺牲语言功能的前提下保持了良好的简洁性。它是第一个体现狄克斯特拉(Dij kstra)和霍尔(Hoare)的结构化程序设计思想的语言,其主要特点还在于一系列朴素而有效的用户自定义数据类型功能。它是这个时期最成功的语言之一。
BASIC(Beginner’s All-purpose Symbolic Instruction Code)语言是由Dartmouth学院的Tomas kurtz和John komeny在20世纪60年代中期开发出来的,目的是为了向非理工科的学生提供一个简单的编程环境,使业余程序员也能快速掌握和使用。BASIC语言的名字可直接翻译成“初学者通用符号指令码”,它具有一个类似FORTRAN语言的简单代数语法并定义了有限的控制结构和数据结构。近代的BASIC语言已今非昔比,它吸收了许多语言的特性,大大扩充了其功能。BASIC语言在我国一段历史时期内曾有广泛的影响。
BASIC语言没有引入更多的新概念,但它的交互式工作环境对后来的语言发展产生了很大影响。它不采用编译方式而是采用解释方式来执行程序,这是它的另一个重要特点,它建立了一套新的程序设计风格。
1.4.5 大量的探索
20世纪60年代,高级语言得到了蓬勃发展,计算机应用领域不断扩大,应用人员猛增,系统越来越大,实现的要求也越来越高,终于爆发了“软件危机”。这时,人们才感觉到软件开发应当按工程进行。于是,在20世纪70年代掀起了软件工程热潮,支持系统软件开发的程序设计语言也应运而生,如CLU,Alphard,Mesa,并发Pascal和Gypsy等语言。这大大推动了对程序设计语言的研究、试验和评价。
这一时期的语言研究涉及许多重要概念,例如信息隐蔽、抽象数据类型、异常处理和并行处理机制等。这些概念将在本书中进行专门的讨论。
20世纪70年代设计,在实践中脱颖而出并发展延续至今的有Modula 2和C语言。Modula语言是在Pascal语言成功的基础上,由沃斯(Wirth)于1977年设计的,1979年编译实现,1982年发表扩充报告,1984年公布了Modula 2。该语言支持独立编译的模块结构。Modula 2是为实现实时系统和并行系统的综合功能而设计的,但该语言至今尚未广泛应用。
为了克服ALGOL 60语言太抽象的缺点,英国剑桥大学和伦敦大学在1963年推出了CPL(Combined Programming Language)语言。1967年,Richards将CPL提炼,推出了保持CPL较好特性而又容易学习和实现的BCPL(Basic Combined Programming Language)语言。1972年,Ritchie在实现UNIX操作系统时,使用了BCPL的一个子集,称为B语言。1978年,Kemighan和Ritchie发表了《The C Programming Language》一文,正式推出了实现UNIX操作系统的工作语言——C语言。由于C语言功能强大,所占空间小,表达简洁,具有通用语言的特性,很快受到广大用户的欢迎。C语言最大的特点是具有高级语言和低级语言的优点,有人称它为“汇编语言的速记形式”,所以它特别适合描述系统程序;同时,它也适用于各种应用领域,几乎所有程序设计任务都可用C语言编程实现。C语言的缺点是,在大量使用指针的情况下,其出现的错误不易查找,存在不安全的因素。
1.4.6 Ada语言
20世纪70年代初期,系统开发的硬件费用逐步下降,软件开发费用急剧上升,软件的可移植性提到了议事日程上。首当其冲的是美国国防部系统,他们至少使用了450种通用语言,500~1500种不同的高级语言和汇编语言,这给软件的移植带来了极大的困难。对于同一问题,因为使用的语言或机器不同,不得不做大量重复的编程工作,这也浪费了大量的物力和财力。于是,美国国防部(DOD)提出开发一种嵌入式的实时程序设计语言。
为了避免以前出现的语言选用和设计的混乱状态,DOD成立了高级语言工作组(HOL-WG)。该工作组工作非常细致,按军事计划来对需求进行调查,从1975—1978年,经历了“稻草人”、“木头人”、“锡人”、“铁人”和“钢人”计划后,最终确定了语言需求。HOLWG最初的想法是使用或提高一种现有的语言,例如Pascal、ALGOL或PL/1,但是人们最终认识到没有一种现有的语言能满足这些需求。
为了缩短设计和实现语言的周期,HOLWG采用了国际招标的方式在全世界招标,这使得业界和研究机构之间展开了非常激烈的竞争,最初在提交的17个方案中选中了4个方案,并把这4个语言编码分别称为“红色语言”、“绿色语言”、“黄色语言”和“蓝色语言”。最终选定法国人Jean Ichbiah设计的绿色语言,称为DOD-1语言,后来为了纪念计算机先驱者——世界上第一位软件工程师Ada Lovelace,将该语言称为Ada语言。
Ada语言的出现在学术界引起了强烈反响,当然也有批评意见,批评者认为它太复杂,因此不实用。我们认为,Ada与其他大多数语言不同,它是为一个专门的问题域(即嵌入式计算机系统)设计的。这个领域对语言有一系列的特殊要求,因此它是在Pascal语言的基础上引入的一个规模不大的、容易理解的概念集合(例如数据抽象、信息隐蔽和强类型等)。从某种意义上来说,Ada语言是直接体现现代软件设计方法学的语言,因此它是对问题求解进行程序设计的一种恰当的描述工具。Ada语言在某种意义下帮助我们打破了冯·诺依曼体系结构框架的思维模式。使我们可以按照实际问题空间考虑问题的解,从而使可读性、可靠性和可维护性都有所提高。
DOD在公布Ada语言之后,硬性规定不允许对标准语言进行任何扩充,也不接受该语言的任何子集。Ada语言参考手册严格定义了语言的一致性,不允许任何对语言的添加和减少,但后来这一规则在一定程度上有所松动。例如,一个简单的汽车控制系统很少使用复杂的文件管理系统,如果目标系统不要求此项功能,则为此应用系统编写的编译程序就可以不包含该功能。
1.4.7 第四代语言
在应用COBOL语言的传统领域中,有了越来越多的高级工具,这类工具称为超高级语言(Very-high-level Language),即所谓第四代语言(Fourth-generation Language)。例如,数据库和查询语言、扩展表格,以及可由程序员(甚至最终用户)用来开发应用的各种生成器。与一般语言相比,这类语言的特征是表达力更强,使用更方便,更接近于问题的描述。与高级语言相比,超高级语言除了包含用以描述实现算法的实现性成分外,还包含一些抽象级别更高的用以描述功能的成分。也可以说,超高级语言着重扩大程序员关于“做什么”的描述能力,而不是描述“怎么做”的细节,“怎么做”由系统帮助实现。从这个意义上说,这类语言也就是规范性语言,面向问题的语言(Problem-oriented Language)。典型的第四代语言是结构查询语言SQL。
1.4.8 网络时代的语言
20世纪80年代,当机器变得更快、更小和更便宜时,人们开始更广泛地应用在商业环境中,各家公司都用中央处理机汇总处理数据,如工资单;用分机处理本地事务,如订单、报表和营业额等,这时出现了分布式计算机系统。到20世纪90年代,分布式局域网开始进入全球网——因特网(Internet),这时世界进入了网络时代,出现了重要的网络语言Java和C#。
1.Java语言
Java是一种通用、并发、基于类的面向对象的程序设计语言。Java语言的名字来源于印度尼西亚的一个岛名“爪哇”。
Java语言诞生于1991年,当时Sun Microsystems公司的James Gosling领导的Green小组试图开发一种面向消费类数字设备的语言。1992年夏,他们实现了第一个版本,但他们的工作超前了,未得到业界的关注和接受。
1993年,出现了Mosaic网络浏览器,这对Internet从学术领域走向商业领域起到了推动作用。Green小组立刻认识到他们开发的语言可以用来提高浏览器的性能。因为浏览器需要执行若干协议,网络到用户的传输速率又很有限,所以当网络用户等待信息显示时,他们的计算机常常处于空闲状态。Sun Microsystems公司认识到他们开发的语言在网络上很有价值。1994年,Sun Microsystems公司发布了包含Java虚拟机的Hotjava浏览器。1995年5月23日,Netscape Communications公司的创始人之一Marc Andressen宣布Netscape将在其Netscape浏览器集成Java虚拟机,而此时的Netscape已占有70%的浏览器市场。从那以后,Java语言的应用迅速增加,虽然设计Java语言的目的是用于开发网络浏览器的小应用程序,但是作为一种通用的程序设计语言,Java语言已被广泛接受,并且有可能代替C和C++语言成为业界首选的编程语言。
Java语言类似于C和C++。从历史上看,它们之间有一定的关系。20世纪70年代,C语言作为一种开发操作系统的语言而出现,因此,C语言的设计者主要是想开发一种允许访问计算机底层结构的语言。Stroustrup在开发C++时,从SIMULA语言中引入包的概念,从Smalltalk语言引入继承的概念,但基本的C语言并未修改。所以,C++语言沿袭了C语言所具有的便于开发系统程序的特点。当Sun Microsystems公司开发Java语言时,他们保留了C++语言的语法、类和继承等基本概念,删除一些不好的特征。因此,Java是一个比C++更简单的语言,作为一种有用的语言,其语法和语义比C++语言更合理。
可以说Java是在C和C++语言基础上开发的语言,但又吸收了其他语言的一些有益的成分。类的概念来自于C++和Smalltalk语言,但Java只限于单实现继承。接口的概念来自于Obiective-C语言,Java提供多接口。包的概念来自于Modula语言,在Java中增加了层次性名字空间和逻辑开发单元。并发的概念来自于Mesa语言,Java内置了多线程支持。异常处理的概念来自于Modula 3语言,在Java方法中增加了抛出异常的说明。动态链接与自动内存回收的概念来自于LISP语言,Java的类可以在需要时装入内存,不需要时将其释放。
Java与其他语言的不同之处在于,它为减少与具体实现的相关性,做出了特别的努力。Java允许程序员只编写一次代码,就可以使其代码在Internet上的任何地方毫无阻碍地运行。Java语言的设计目标是,只要给定足够的内存空间和时间,一个确定的程序无论在任何机器上,以何种实现方式运行,总能得到相同的运算结果。几年间,Java语言已从“诞生”走向“成熟”,并得到了广泛应用。同时,它还在不断地发展,并不断推出新的版本。这种改进和完善是建立在同原有版本完全兼容的基础之上的。Java语言的特性很多,有些特性将在数据类型和控制机制中讨论,这里讨论它的一部分特性。
(1)面向对象
过程式语言对问题求解的描述,是通过对计算机执行的一系列步骤的描述来实现的。而面向对象语言则用问题空间中的元素与对象来描述问题。这样,一个好的设计就可以得到可复用、可扩充和可维护的组件。这些组件可以灵活地适应处理环境的改变,因为对象之间的主要工作就是来回发送消息。
Java语言基于类(Class),类的实例就是对象。面向对象是一种程序设计方法,这些方法与程序设计语言一样,要经过“诞生”、“成熟”和“消亡”的历程。面向对象方法正处于“成熟”阶段。但是,现在也有人对它提出批评,认为它将被构件方法所代替。
(2)解释性
Java源程序编译成平台中立的字节码,这些字节码可以传输到任何具有Java运行环境的平台,其中包括Java虚拟机,从而在运行时不需要重新编译和重新连接。Java解释器通常在网上运行,网上信息传输相对来说比较慢,在等待传输的空闲时间就可以解释执行Java字节码。另外,开发商还提供了一种即时(Just-in Time)编译器,对那些要求快速运行的程序进行即时编译,并充分考虑了优化,从而达到了与C++语言同样的执行速度。
(3)简单性
Java的风格类似于C和C++,因而熟悉C和C++语言的程序员可以很快掌握Java语言的编程技术。Java语言提供了丰富的类库,使编程变得比较简单。Java语言抛弃了指针,明确了类型转换的语义规则,降低了程序出错的可能性,使程序逻辑更清晰。
(4)高效性
Java语言的多线程并发执行,节省了CPU的空闲时间。高效字节码与机器代码的执行效率相差无几。
(5)动态性
Java语言实现动态内存管理,能及时回收无用存储单元。
(6)分布性
Java语言的动态特性使它在分布式环境,尤其是在Internet环境中提供方便的动态内容支持。
(7)健壮性
健壮性主要反映程序的可靠性。Java语言为此提供了大量的支持。Java是强类型语言,制定了严格的编译时类型检查规范。Java语言没有指针,减少了许多隐藏错误。Java语言动态自动回收无用存储单元(释放无用单元),使程序员无须进行内存管理。Java语言鼓励用接口而不是用类。接口定义一组行为,而类实现这些行为。传递接口而不传递类,从而可隐藏这些实现细节。若要改变实现细节,只需要新类实现旧接口,其余一切照常工作。
(8)安全性
Java语言定义了严密的安全规范,从而保证程序的安全执行。
(9)可移植性
Java程序一次编写可到处运行。Java语言为内部类型的实现定义了严密的规范,不会出现各种不同的“方言”。
(10)并发性
Java语言支持多线程,从而支持程序在单机上的并发执行,或者在多机上的并行运行。Java语言以监控状态模型为基础提供了对同步的支持。
(11)平台无关性
Java程序是由Java虚拟机来执行的。Sun公司撰写了“Java虚拟机规范”,各操作系统供应商提供与平台相关的符合规范的Java虚拟机。Java源程序经编译成字节码后,就可由各种不同操作系统上的遵守相同规范的Java虚拟机来执行,且能获得相同的执行结果。这就是Java跨平台的秘密,从而实现了Java语言与平台无关。事实上,Java语言的跨平台特性是以Java虚拟机不能跨平台为代价的。如果我们设想,BASIC语言有一个“BASIC虚拟机规范”,各操作系统供应商按此规范提供各自的BASIC虚拟机,那么,BASIC语言也就具有跨平台的特性了。
2.C#语言
C#(C sharp)是微软开发的一种面向对象语言,其目标是既拥有C++的执行效率和运算能力,也具备如VB一样的易用性。C#是基于C++的一种语言,同时包含类似Java的很多特征。
对于C/C++用户来说,最理想的解决方案无疑是在快速开发的同时又可以调用底层平台的所有功能。他们想要一种和最新的网络标准保持同步并且能和已有的应用程序良好整合的环境。另外,一些C/C++开发人员还需要在必要的时候进行一些底层的编程。
C#是一种最新的、面向对象的编程语言。它使得程序员可以快速地编写各种基于Microsoft.NET平台的应用程序。
正是由于C#面向对象的卓越设计,使它成为构建各类组件理想的选择——无论是高级的商业对象还是系统级的应用程序。使用简单的C#语言结构,这些组件可以方便地转化为XML网络服务,从而使它们可以由任何语言在任何操作系统上通过Internet进行调用,即任何平台的应用程序都可以通过Internet调用它。
扩展交互性作为一种自动管理的,类型安全的环境,C#适合于大多数企业应用程序。但实际的经验表明有些应用程序仍然需要一些底层的代码,要么是因为基于性能的考虑,要么是因为要与现有的应用程序接口兼容。这些情况可能会迫使开发者使用C++,即使他们本身宁愿使用更高效的开发环境。
C#采用以下对策来解决这一问题:
(1)内置对组建对象模型(COM)和基于Windows的API的支持;
(2)允许有限制地使用纯指针(Native Pointer)。
在C#中,每个对象都自动生成为一个COM对象。开发者不再需要显式的实现IUnknown和其他COM接口,这些功能都是内置的。类似的,C#可以调用现有的COM对象,无论它是由什么语言编写的。
C#是一种现代的面向对象语言。它使程序员快速便捷地创建基于Microsoft.NET平台的解决方案。
C#增强了开发者的效率,同时也致力于消除编程中可能导致严重结果的错误。C#使C/C++程序员可以快速进行网络开发,同时也保持了开发者所需要的强大性和灵活性。
C#是被设计工作在微软的.NET平台上的,微软的目标是使数据和服务的交换在网页上更容易,并且允许开发人员构建更高的程序可移植性。C#可以方便地用于XML和SOAP,并可以直接访问程序对象或方法,而不需要添加额外的代码。所以程序可以构建在已存在的代码上,或者多次重复的使用。C#的目标是为市场开发产品和服务时更快捷且成本开销更低。
微软与ECMA(欧洲计算机制造商协)合作,建立了C#的标准。国际标准化组织(ISO)称赞C#可以鼓励其他公司开发属于自己的产品。
C#已经被Apex Software,Bunka Orient,Component Source,devSoft,FarPoint Tech-nologies,LEAD Technologies,ProtoView,和Seagate Software等公司采用。
1.4.9 新一代程序设计语言
程序设计语言受到冯·诺依曼概念的制约,使它存在许多局限性,摆脱冯·诺依曼概念的枷锁是众多计算机语言学家奋斗的目标。为此,出现了许多不同风格的语言,这些工作促进了语言基本理论和新的体系结构的研究。这些语言主要是函数式(LISP,FP,FFP)、对象式(Smalltalk,EIFFEL,C++)和逻辑式(Prolog)语言。
1.4.10 面向未来的汉语程序设计语言
从计算机诞生至今,计算机自硬件到软件都是以印欧语为母语的人发明的。所以其本身就带有印欧语的语言特征,在硬件上CPU、I/O、存储器的基础结构都体现了印欧语思维状态的“焦点视角”,精确定义,分工明确等特点。计算机语言也遵照硬件的条件,使用分析式的结构方法,严格分类、专有专用,并在其发展脉络中如同他们的语言常用字量和历史积累词库量极度膨胀。实际上,计算机硬件的发展越来越强调整体功能,计算机语言的问题日益突出。为解决这一矛盾,自20世纪60年代以来相继有2000多种计算机语言出现,历经五代,至今仍在变化不已。
汉语程序设计语言从根本上来说是完成了汉语言与计算机机器语言的有机结合,使程序设计语言具有汉语的优势特性。
汉语程序设计语言,是指我国自行开发,自主版权的以汉语为描述语言的计算机程序设计语言。该语言绝非曾流行过的任何一种计算机语言的简单汉化,或是为某种软件制造一个中文环境。这是一个完全由中国人自行开发,由中国人掌握全部源代码,从形式到内容全面符合中国人的思维方式,使用汉文字表达的计算机程序设计语言。汉语没有严格的语法框架,字词可以自由组合、突出功能的整体性语言。在计算机语言问题成为发展“瓶颈”的今天,汉语言进入计算机程序设计语言行列,已经成为历史的必然。汉语编程之父沈志斌认为“这是一个国家、一个民族的核心技术机密问题!”。
在字符上,西方语言是表音符号,而汉语是表意符号,在语言形态上,西方语言有严密的结构,通过词与词之间的组合形成语言块,方能进行完整的表述;在语言的运用中,为适应对象的需要大量造词。而汉语言以独立的词根为基本词素,自由组成词,在句子中运用自由,以极少量的常用词组合为无限的词汇。
在语言文化上,西方语言以分析型形态为主,汉语则以整体功能为主。
1.发展汉语程序设计语言的理由
(1)计算机语言问题的解决,只能从人类语言中寻找解决方案。
(2)计算机语言的现存问题是形式状态与功能需求的矛盾。
(3)计算机硬件的发展已为整体性语言——汉语进入计算机程序设计语言提供了条件。
2.汉语程序设计语言的技术特点
(1)汉文字的常用字高度集中,生命力极强,能灵活组合,简明准确地表达日新月异的词汇,这些优点是拼音文字无法企及的。
(2)汉语言的语法简易灵活,语词单位大小和性质往往无一定规,可随上下语境和逻辑需要自由运用。汉语言的思维整体性强,功能特征突出。
(3)汉语程序设计语言的发明者采用核心词库与无限寄存器相结合的方法,实现了汉语言的词素自由组合;将编译器与解释器合一,使汉语程序设计语言既能指令又能编程;以独特的虚拟机结构设计,将数据流与意识流分开,达到汉语程序设计语言与汉语描述完全一致,通用自如。
具有汉语言特性的汉语程序设计语言的出现,打破了汉语言不具备与计算机结合的条件而不能完成机器编码的神话。还为计算机科学与现代语言学研究提出了一条崭新的路径,它从计算机语言的角度,从严格的机械活动及周密的算法上,向世人证实汉语的特殊结构状态,及其特殊的功能。
汉语编程的适用领域:由于汉语程序设计语言是一种计算机通用语言,它可以广泛适用于单片机、PC、服务器、工作站和大型机。
3.汉语程序设计语言发展
(1)历史
1983年汉语程序语言的发明人沈志斌开始研究如何用汉语来编写计算机程序。1984—1989年是汉语编程的基础构想和基础算法及其基本功能验证阶段。1989—1994年是汉语编程嵌入式系统的开发及应用的阶段,其中1992年完成汉语程序语言1.0版(DOS版本),1993年发展出汉语程序语言嵌入式系统,1994年由电子工业出版社出版《汉语程序设计语言》,为汉语编程技术建立了基础,并成功申报了国家发明专利(专利号:94107330.0)。1994—1999年是汉语编程嵌入式系统在多种行业中应用及Windows平台汉语编程系统发展阶段。随着世界信息技术的发展,汉语编程技术在与新技术的继承和调用上的灵活性已独具特点,1994年至今,是汉语编程嵌入式系统、汉语程序设计语言、汉语编程数据库开发环境、软件工程整体发展阶段,其中,1997年汉语程序语言1.0版(Windows 9.X NT版本),2000年3月汉语程序语言2.0版完成(浮点运算和浮点数据库)。
(2)现状
嵌入式系统已完成超小容量4K在线编程,接口技术完备,PC:已完成DOS、Windows 9 X、NT外挂汉语编程语言。
4.汉语程序设计语言的意义
(1)面对问题
汉语程序设计语言,极具针对性地解决了目前计算机语言所存在的问题。汉语程序设计语言有功能独特的解码器,可以从指令到编程使用一种语言。寻找到了极富创意的语言结构方案,可以使汉语程序设计语言适用于单片机、嵌入式系统、各种PC、大、中、小型机,完全相同于人类语言的描述方式,学习简易,编程方便,维护轻松。语言结构特殊,安全性极高,不受病毒及网络侵害。
(2)面向未来
汉语程序设计语言是面向未来的计算机语言,其通用的构造,灵活的形态及在网络间来往自如的功能,可为计算机使用者提供无限的发展空间。
(3)人才培养
在汉语程序设计语言的研发过程中,为解决汉语言与计算机有机结合的问题,公司研发人员步步攻关、层层铺码、开发工具、剖析硬件,培养了一批与传统计算机人员知识结构完全不同的技术人员。这些技术人员拥有最深层的语言开发资料,软硬一体化的设计思想。面对未来能够提出最新型的技术方案和有效地解决问题的办法。
5.汉语程序设计语言的作用
(1)打破西方对东方的计算机语言的垄断,使中国人拥有自主版权的先进的计算机语言。
(2)易学易懂的汉语程序设计语言,将极大地推动中国信息业的发展,造就无数的就业机会。
(3)世界最大计算机消费市场与先进的计算机语言结合,将改变现今的经济格局,形成世界上最大的软件产业市场。
(4)结合中国家电业的现状,快速提高中国家电的质量,将网络家电的概念,提高到整体智能家电的水平。
(5)改变计算机教育现状,把跟随西方的计算机教育,改变为自主创新的教育。
(6)迅速提高各行业信息化水平、沟通多学科的交流与边缘学科的发展,极大地促进国家综合国力的提高。
作为一个发展中国家,由于历史的缘由,在计算机语言开发上处于落后的地位。汉语程序设计语言开发成功的意义,仅仅在计算机语言研发深层资料的占有上就已非同一般。
特别要指出的是,汉语程序设计语言的实现不单是打破计算机语言的垄断格局,而是将世界计算机软件的开发与应用提高到一个新的水平。
1.4.11 总结
是否存在一种完美无瑕的语言?是否应该存在多种风格的语言?是否应该把多种风格融合成一个统一体,建立一个统一风格的语言?语言学家正在从数学基础,语义定义、实现和应用等方面对这些问题进行研究和探索。今后10年,将是一个令人激动的10年,预计将会产生和完善新一代程序设计语言。
表1-1中按出现年代顺序,列出一些本书涉及的主要语言。
表1-1 主要程序设计语言列表
注:①语言设计和最初实现;②语言设计;③第一个官方语言描述。
表1-2(摘自文献[59])简要列举了自20世纪下半叶起每5年为一个时间段出现的有重要影响的语言和技术。该表忽略了一些在历史上发挥过一定作用的语言。
表1-2 程序设计语言的主要影响
图1-3展示了主要高级程序设计语言及其相互之间的关系。
图1-3 主要高级程序设计语言及其相互之间的关系