小弟我了解的主要程序设计语言的发展

我了解的主要程序设计语言的发展

       沉默呵,沉默呵!不在沉默中“洗心革面”,就在沉默中“彷徨虚度”。 ——致逝去的它

ALGOL系列语言的早期后代语言

 

为简单性而设计:Pascal语言

Pascal语言最重大的影响在于程序设计的教学。1970年,计算机科学、计算机工程和理学专业的大部分学生都以Fortran语言作为程序设计的入门,有些大学使用PL/I(由IBM开发的产品)、基于PL/I的语言和ALGOL-W(NiklausWirth 和C.A.R.(“Tony”)Hoare的ALGOL60版本)。到20世纪70年代中期,Pascal语言已经成为最广泛的教学语言。直到20世纪90年代末,Pascal语言才不再是大专院校中最普遍使用的程序设计教学语言。

由于Pascal设计为教学语言,所以它缺少一些对很多应用领域很重要的特性。最好的例子是无法写一个以不定长的数组作为参数的子程序,另一个例子是没有单独的编译能力。这些缺陷导致了许多非标准的方言的产生,例如Turbo Pascal。

Pascal语言在程序设计教学和其他应用上的广泛普及,主要在于简单性和表达性的出色结合。虽然Pascal语言中有一些不安全的因素,但它任然是一种相对安全的语言,特别是与Fortran语言和C语言相比。到20世纪90年代中期,Pascal语言在工业界和高校的普及率都开始下滑,这主要是由于Modula-2、Ada(为美国国防部开发)和C++的兴起,这些语言包含Pascal语言中没有的特性。

可移植的系统语言:C语言

       C语言的祖先包括CPL(20世纪60年代早期在剑桥大学开发的)、BCPL(一种简单的系统语言,也是在剑桥大学有Martin Richards在1967年开发的)、B和ALGOL68语言。20世纪60年代晚期,KenThompson在贝尔实验室从事UNIX操作系统最早的相关工作,最初的版本是用汇编语言写的(PS:UNIX操作系统几乎完全是用C语言(ISO,1999)编写的,因此该系统更容易移植到不同的计算机上)。在UNIX系统上实现的第一种高级语言是B语言,它是基于BCPL语言的,由Thompson在1970年设计和实现。

       BCPL和B都不是类型化的语言,是高级语言中的另类,虽然它们与Java这样的语言相比低级很多。非类型化意味着所有的数据都是机器字,这样虽然简单,但会导致许多复杂性和安全性问题,例如如何在表达式中指定是浮点类型而不是整数类型的算术运算的问题。在BCPL语言的一种实现中,在浮点运算的变量操作数前面放一个句号,前面没有句号的变量操作数就认为是整数。另一种方法是用别的符号来表示浮点运算。

       由于存在这个问题和其他一些问题,人们又开发了一种基于B语言的新的类型化语言。这种语言最初命名为NB,后来命名为C,是DennisRitchie于1972年在贝尔实验室设计和开发的(Kernighan和Ritchie, 1978)。C语言部分通过BCPL语言、部分直接的受到ALGOL68的影响,这从它的for和switch语句、赋值运算符、以及对指针的处理中可以看出来。

 

结合命令式和面对对象的特性:C++

 

       C++模仿Simula 67(ALGOL 60的一个扩展,继承了它的块结构和控制语句),在C语言的基础上建立了语言机制,支持Smalltalk(第一种完全支持面向对象程序设计的语言)许多开创性的特性。C++是在C语言的基础上通过一系列修改发展而来的,改进了命令式的语言特性,增加了支持面向对象程序设计的语言结构。

       2002年,Microsoft公司发布了.NET计算平台,包含一个新的C++版本,称为托管C++(ManagedC++,MC++)。MC++扩展了C++,提供对.NET框架功能的访问,增加的部分包括属性、委托、接口和垃圾收集对象的引用类型。由于.NET不支持多继承,因此MC++也不支持。

       C++迅速成为一种非常受欢迎的语言,并一直保持如此。它受欢迎的因素之一是具有优秀且廉价的编译器,另一个因素是几乎完全与C语言向后兼容(就是说C语言程序可以只做很少修改就作为C++程序来编译),而且在大部分实现中可以将C++代码与C语言代码链接在一起,(这个之前在刷acm的时候,深有体会),因此对于许多C语言程序员来说,学习C++相对简单。最后,在C++刚出现时,面向对象的程序设计开始得到广泛的关注,C++是当时唯一适用于大型商业软件项目的语言。

       至于C++的缺点,由于它是非常庞大和复杂的语言,显然与PL/I的缺点相似。它继承了C语言大部分的非安全因素,因此与Ada和Java这些语言相比,它不够安全。

一种相关语言:Objective-C

       Objective-C(Kochan,2009)是另一种具备命令式和面向对象特性的混合语言。Objective-C是由Brad Cox和Tom Love在20世纪80年代早期设计的。最初,它包含C以及Smalltalk的类和消息传递功能。在已创建的程序设计语言中,都是给命令式语言添加对面向对象程序设计的支持,而Objective-C是唯一一个使用Smalltalk语法提供该支持的语言。

       SteveJobs离开苹果公司,创立了NeXT后,就获得了Objective-C的许可,并将它用于编写NeXT计算机系统软件。NeXT还发布了它的Objective-C编译器、NeXTstep开发环境和一个工具库。NeXT项目失败后,苹果公司购买了NeXT,并使用Objective-C编写MAC OS X。Objective-C是所有iPhone软件的编写语言,所以在iPhone面世后,就迅速流行起来。

       Objective-C是C的一个严格超集,所以C语言的所有非安全特性都出现在Objective-C中。

另一种相关语言:Delphi

       Delphi是一种混合语言,与C++和Objective-C相似,它是在已有的命令式语言Pascal中增加了面向对象支持及其他一些特性后得到的。C++和Delphi的许多区别来自于其祖先语言,以及产生它们的程序设计文化背景。由于C语言是一种强大但具有潜在不安全因素的语言,所以C++也是这样,至少在数组下标范围检查、指针运算和大量强制类型转换等方面是这样。同样,由于Pascal比C语言更优雅和安全,Delphi也比C++更优雅和安全,Delphi也不如C++复杂。

       Delphi与Visual C++一样,为开发人员提供了图形用户界面(GUI)和为用Delphi编写的应用程序创建GUI界面的简单方法。Delphi是由Anders Hejlsberg设计的,他之前开发过Turbo Pascal系统。这两种语言都是由Borland公司销售和发行的。Hejlsberg也是C#的主要设计人员。

 

基于命令式的面向对象语言:Java

       Java和许多程序设计语言一样,是因为某个应用领域没有令人满意的已有语言而设计的。1990年Sun公司(Sun Microsystems)认为需要一种程序设计语言用于嵌入式消费类电子产品,例如电烤箱、微波炉和交互式电视系统。

       虽然Java最初的动力是消费类电子产品,但在Java刚出现的几年中,使用Java的产品都没有上市销售。这主要由于出现了新的图形化浏览器,万维网(World Wide Web)自1993年开始得到广泛应用,Java成为网页程序设计的有效工具。特别是相对小巧的Java程序——Java applet,在网络浏览器中解释,其输出结果可包含在要显示的网页文档中,在20世纪90年代中后期迅速得到广泛应用。在Java流行的最初几年中,网络是Java最常见的应用领域。

       Java的设计人员很好地去除了C++中多余的和不安全的特性。例如,去除C++一半的赋值     强制转换,显然是迈向更高可靠性的一步。数组访问的下标范围检查也使语言更加安全。并发的加入扩展了语言所能适用的应用领域,加入图形用户界面、数据库访问、网络访问的类库也起到了这样的作用。

       Java的可移植性,至少以中间代码形式的移植,常常被人们归功于语言的设计,但实际上并不是。任何语言都可以翻译为一种中间代码,并且运行在具有该中间代码虚拟机的任何平台上。这种可移植性的代价就是解释执行的代价,通常比机器代码的执行慢一个数量级。Java解释器的初始版本称为Java虚拟机(Java Virtual Machine,JVM),实际上至少要比相应的编译过的C程序慢10倍。但是,人们现在使用即时(Just-in-Time,JIT)编译器,在执行前将许多Java程序翻译为机器代码,使Java程序的效率与C++这类传统的编译语言的程序效率相当。

 

一流的.NET语言:C#

       Microsoft公司在2000年发布了C#和新的开发平台.NET,2001年1月发布了两个产品的正式版。

C#基于C++和Java,但是包含了一些Delphi和Visual BASIC的思想。它的主要设计者AndersHejlsberg还设计过Turbo Pascal和Delphi,这可以解释C#中存在Delphi成分的原因。

C#的目标是提供一种语言用于基于组件的软件开发,特别是在.NET框架上进行这样的开发。在这一环境下,各种语言的组件可以很容易的组合成系统。所有的.NET语言,包括C#、Visual Basic .NET、托管C++、F#和Jscript .NET,都使用通用类型系统(CommonType System,CTS)。CTS提供了一个通用的类库。所有5种.NET语言的所有类型都继承自一个根类System.Object。符合CTS规范的编译器所生成的对象可以组合到软件系统中。所有5种.NET语言都编译为同一种中间形式——中间语言(Intermediate Language,IL)。不过与Java不同,IL不是解释执行的。在执行前,一个即时编译器会将IL翻译为机器代码。

C++和Java都有两套不同的类型系统,一套用于基本类型,一套用于对象。除了容易混淆之外,还经常需要在两套系统之间进行值的转换,例如将一个基本类型的数值放入一个存储对象的集合中。C#通过隐式的装箱(boxing)和拆箱(unboxing)操作,在这两套系统之间进行值的半隐式转换。

 

脚本语言

 

       早期的脚本语言用于在文件中输入一系列待解释执行的命令,称为脚本。这类语言的第一种称为sh(shell的简称),最初是少量命令的集合,这些命令经解释后调用系统子程序,执行诸如文件管理、简单的文件过滤这类工具函数。在这一基础上增加变量、控制流语句、函数,以及各种其他功能,就得到了一种完整的程序设计语言。这类语言中功能最强大最广为人知的一种是ksh(Bolsky和Korn,1995),是由贝尔实验室的DavidKorn开发的。

       还有一种脚本语言名为awk,是贝尔实验室的Al Aho、Brian Kernighan和Peter Weinberger开发的。awk最初是一种报表生成语言,但是后来成为一种更通用的语言。

Perl

       Perl语言是由LarryWall开发的,最初是sh和awk的组合。Perl自诞生以来有着巨大的发展,现在已经是一种功能强大的程序设计语言,但任有些原始。虽然Perl仍然称为脚本语言,但它实际上更像一种典型的命令式语言,因为它总是编译执行的,至少是在执行前先编译为一种中间语言。而且,它具有所有需要的语言结构,可适用于各种有计算问题的领域。

JavaScript

       20世纪90年代中期,在第一批图形浏览器出现后,万维网的使用呈爆炸式增长。HTML文档本身是完全静态的,与HTML文档相关的计算需求很快变得非常重要。通用网关接口(CGI)使服务器端的计算成为可能,它允许HTML文档请求在服务器上执行程序,并将这种计算的结果以HTML文档的形式返回给浏览器。在浏览器端的计算随着Java applet的出现也成为可能。这两种解决方案现在大都被新的技术替代,主要就是脚本语言。

       JavaScript最初由Netscape公司的Brendan Eich开发,其最初的名称是Mocha,后来命名为LiveScript。1995年后期,Netscape和Sun公司联合投资LiveScript,并将其更名为JavaScript。

       虽然JavaScript解释器可以嵌入到许多不同的应用程序中,但它最常见的用途是嵌入在Web浏览器中。JavaScript代码嵌入在HTML文档中,在文档显示时由浏览器进行解释。在网页程序设计中,JavaScript的主要用途是验证表单输入数据的正确性,并生成动态的HTML文档。JavaScript也与Rails网页开发框架一起使用。

       虽然名为JavaScript,但它与Java的关联只是采用了相似的语法。Java是强类型化的,但JavaScript是动态类型的。JavaScript的字符串和数组具有可变的长度,因此并不检查数组下标的有效性,而这在Java中是要求检查的。Java完全支持面向对象的程序设计,但JavaScript既不支持继承,也不支持将方法调用动态绑定到方法上。

       JavaScript最重要的用途之一是动态创建和修改HTML文档。JavaScript定义了一个对象层次结构,与由文档对象模型(Document Object Model)定义的HTML文档的层析模型相吻合。HTML文档的元素可通过这些对象来访问,提供了动态控制文档元素的基础。

PHP

       1994年,Apache小组的成员Rasmus Lerdorf开发了PHP语言。他的初衷是提供一个工具来跟踪他个人网站的访问者。1995年,他开发了名为个人主页工具(Personal Home Page Tools)的软件包,这成为PHP语言第一个公开发布的版本。PHP最初是个人主页(Personal Home Page)的简称,后来它的用户群开始使用递归的名称“PHP:超文本预处理器(PHP:Hypertext Preprocessor)”,后来原始的名称不再使用了。PHP语言现在作为一个开源产品来开发、发布和提供支持。PHP处理器在大多数网页服务器中都有。

       PHP是专门为Web应用设计的内嵌于HTML的服务器端脚本语言。当浏览器请求内嵌PHP代码的HTML文档时,PHP代码就在Web服务器上解释执行。PHP代码通常生成HTML代码作为输出,来替换HTML文档中的PHP代码,因此Web浏览器不会看到PHP代码。

       PHP语言与JavaScript的语法形式很像,它的字符串和数组本质上都是动态的,并采用动态类型。PHP的数组结合了JavaScript的数组和Perl的哈希。

       PHP最初的版本不支持面向对象的程序设计,但是在第二版中添加了支持。不过PHP不支持抽象类或接口,不支持析构函数和类成员的访问控制。

       PHP很容易访问HTML的表单数据,因此用PHP进行表单处理很方便。PHP对许多不同的数据库管理系统都有支持,因此是构建需要通过Web访问数据库的程序的优秀语言。

Python

       Python(Python这个名字是从Monty Python借鉴来的,而不是源于那条大蟒蛇)由Guido于1989年年底开发,Python语言是基于ABC教学语言的。ABC这种语言非常优秀和强大,是专门为非专业程序员设计的。但是,ABC语言并没有获得广泛的应用,Guido认为是非开放造成的。

       Guido决心在Python中避免这一错误,因此Guido加强了Python和其他语言如C、C++和Java的结合性。同时,他还实现了许多ABC中闪现过但未曾实现的东西。Python的第一个实现是基于Mac机的、Python由ABC语言发展而来,主要受到了Modula-3(另一种相当优美且强大的语言,为小型团体所设计)的影响,并且结合了UNIX shell和C的习惯。

       Python是一种面向对象的解释性编程语言,也是一种功能强大而完善的通用性语言,已经具有二十多年的发展历史,成熟且稳定。Python具有脚本语言中最丰富和强大的类库,足以支持绝大多数日常应用。Python语言具有简洁而清晰的语法特点,适合完成各种高层任务,几乎可以在所有的主流操作系统上运行。

       虽然Python也是一种解释性的脚本语言,但一些大规模的软件开发计划,比如Zope、Mnet、BitTorrent和Google都广泛的使用了该语言,而Python的支持者喜欢称它为高级动态编程语言,因此Python绝非JavaS等只能处理简单任务的脚本语言所能比拟。

       Python作为脚本式语言,吸收了Perl、Tcl等语言的优点,这使得Python具备Tcl的扩展性,同时又具备Perl的文本解析和匹配能力。Python与Lisp也有相似之处,Python可以实现函数式的编程模型。

       Python的两大特色是可扩展性和清晰的语法。Python新的内置模块(module)可以用C或C++写成,也可为现成的模块加上Python的接口。Python的设计者在设计它的时候认为:对于一个特定的问题,只要有一种最好的方法来解决就好了。因此,Python甚至不是一种格式自由的语言,例如,它要求if语句的下一行必须向右缩进,否则不能通过编译。

Ruby

       Ruby是20世纪90年代早期由Yukihiro Matsumoto设计的,在1996年发布,并在此之后不断的发展。开发Ruby的动机是设计者对Perl和Python都不满意。虽然Perl和Python都支持面向对象的程序设计,但都不是纯粹的面向对象语言,至少两者都有基本(非对象)类型且都支持函数。

       Ruby的基本特性在于它与Smalltalk一样,是一种纯粹的面向对象语言,每一数据值都是对象,所有的操作都通过方法调用来完成。Ruby中的运算符只是一种语法机制,为相应运算指明具体的方法调用。由于这些运算实际上是方法,因此可以重新定义。所有类,不管是预先定义的还是用户自定义的,都可以有子类。

       在Ruby中,类和对象都是动态的,因为可以动态的为它添加方法。这意味着在执行过程中,类和对象在不同时刻可以有不同的方法集。因此同一类的不同实例可以呈现不同的行为。在类的定义中,可以包含方法、数据和常量。

       和Python一样,Ruby得用户也可以扩展和修改它。Ruby在文化上也很有意义,因为它是第一种在日本设计并且在美国得到了相对广泛应用的程序设计语言。

 

标记与程序设计混合的语言

JSP

       Java服务端网页标准标签库(JavaServer Pages Standard Tag Library,JSTL)的核心部分是另一种标记与程序设计混合的语言,虽然它的形式和用途与XSLT(可扩展样式表语言转换)不同。在介绍JSTL之前,有必要介绍小服务程序(servlet)和Java服务端网页(Java Server Pages,JSP)的概念。小服务程序是一个Java类的实例,在Web服务器系统中驻存并执行。小服务程序的执行是应Web浏览器当前显示的标记文档的请求。小服务程序的输出以HTML文档的形式返回给发出请求的浏览器。在Web服务器进程中执行的程序,称为小服务程序容器(servlet container),控制小服务程序的执行。小服务程序通常用于表单处理和数据库访问。

       JSP是一些技术的集合,用于支持动态网页文档,提供Web文档的其他一些处理需求。当浏览器请求JSP文档(通常是HTML和Java的混合)时,驻存在Web服务器系统中的JSP处理器程序将文档转换为小服务程序。文档中嵌入的Java代码也复制到小服务程序,纯HTML复制到Java打印语句中并原样输出。JSP文档中的JSTL标记像下一段落中介绍的那样处理。JSP处理器生成的小服务程序由小服务程序容器来运行。

版权声明:本文为博主原创文章,未经博主允许不得转载。