5.脚本呈上升趋势
脚本语言已经存在了很长时间,但最近几年几个因素的综合结果使它的重要性提高了。最重要的因素是应用程序综合向胶着应用程序发展的变换。这种变换的三个实例是图形用户界面,因特网和组件框架。
图形用户界面出现于二十世纪八十年代早期,并在二十世纪八十年代晚期得以普及。在许多编程项目中图形用户界面占了一半甚至更多的比重。图形用户界面基于胶着应用:他的目标不是创建新的功能,而是把图形控制集合和应用程序内部函数联系起来。我不担心任何快速发展的环境因为图形用户界面基于系统程序设计语言,不论是Windows环境,Macintosh Toolbox或Unix Mctif,图形用户界面基于c或c++等已被证明难以掌握,使用不灵活,生成结果不灵活的语言。一些这样的系统有很好的图形工具来设计屏幕输出并隐藏基本语言,而一旦设计者不得不编写代码时一切变得困难起来,像为接口元素提供行为。所有好的快速开发图形用户界面环境都基于脚本语言:Visual Basic,Hyperlard和Tcl/tk,随着图形用户界面的普及,脚本语言也越来越流行。
因特网的增长也使脚本语言变得大众化。因特网只是一种胶着工具,它不创建任何新的计算结果或数据;它只是简单的把大量已经存在的事物联系起来。因特网编程工作的完美工作之一是让所有连接的组件在一起工作,像脚本语言。例如:Perl 因编写CGI脚本而流行,JavaScript因编写网页而流行。
基于脚本的第三个例子是组件框架,像ActiveX,OpenDoc和JavaBeans。虽然系统程序设计语言可以很好的创建组件,但脚本更适合组装组件到应用程序中。没有一个好的脚本语言来操纵组件,组件框架的大部分功能就都没有了。这可以部分解释为什么组件框架在个人电脑上(Visual Basic提供了方便的脚本工具)比在像Unix/CORBA等组件框架中不包含脚本的平台上更成功.
脚本语言继续普及的另一个原因是脚本技术的提高。现代脚本语言像Tcl和Perl离早期脚本语言像JCL的公开宣布已经很远。例如,JCL不提供基本反复而早期Unix外壳不提供过程,即使在今天,脚本技术仍然相对不成熟。例如,Visual Basic不是真正的脚本语言:它最初执行像一个简单的系统程序设计语言,然后修改使之更适合脚本。以后的脚本语言将比现在使用的更好。
脚本技术得益于计算机硬件的加速发展。过去常常用系统程序设计语言在复杂的应用程序中获得可接受的执行。某些情况下甚至系统程序设计语言也不够有效,因此不得不用汇编编写应用程序。然而,今天的机器比1980年的快100-500倍,并且仍在继续以每18个月翻一番的速度增长。今天,许多应用程序可以用解释后的程序执行,并且仍然有出色的执行。例如,Tcl脚本可以操纵几千个对象同时提供好的相互响应。由于计算机速度的不断提高,脚本将对越来越大的应用程序产生吸引力。
脚本语言应用的不断增长最终导致编程群体的改变.二十年前大多数编程者是大型项目的熟练的编程人员.那个时代的编程人员需要花几个月的时间掌握一门语言和它的编程环境,系统程序设计语言就是为这些人设计的.然而,自从个人电脑出现以后,越来越多的非专业编程者加入到编程者的行列.对这些人来说,编程不是他们的主要工作,而只是他们偶尔用来帮助他们工作的工具.偶然编程的例子是简单的数据库查询或者是巨大的扩展片.偶然编程者不希望花几个月的时间学习系统程序设计语言但他们可以花几个小时的时间学到足够的脚本语言知识来写出有用的代码.由于脚本语言由简单的句法并且省略了对象线程等复杂的特性,因而它比系统程序设计语言要容易学.例如,比较Visual Basic和Visual C++,很少有偶尔编程者会选择Visual C++,而大部分会用Visual Basic建立有用的应用程序.
即使在今天,用脚本语言编写的应用程序的数目也远多于用系统程序设计语言编写的应用程序的数目.在Unix系统中有比C程序更多的外部脚本,而在Windows下Visual Basic的编程者和应用程序都比C或C++的要多.当然,多数大型和广泛使用的应用程序都是用系统程序设计语言写成的,所以,如果比较代码总行数或是建立的副本数,则系统程序设计语言略胜一筹.不管怎么样,脚本语言已经是应用程序开发的主动力,并且今后它的市场份额会继续提高.
6.对象的作用
脚本语言在编程语言和软件工程中通常被专家忽视.取而代之,他们更注重像C++和Java等面向对象系统程序设计语言.面向对象编程被认为是代表下一步编程语言发展的主流.像强类型和继承等面向对象 特征 据说可以减少开发时间,提高软件重用率,并解决包括脚本语言技巧等其他问题.
面向对象编程实际能提供多少好处?不幸的是,我还没有看到足够的数据可以确切地回答这个问题.在我看来,对象只能提供一定的好处:或许能提高20-30%的创作力,但决不会有两倍,更不用说是十倍.现在抱怨C++的和喜欢它的一样多,并且一些语言专家开始公开反对面向对象编程.这一段剩下的部分用于解释为什么对象不能像脚本一样显著地提高创作力,并讨论脚本语言中可以获得的面向对象编程的好处.
面向对象编程不能显著提高创作力的原因是他没有提高编程层次或鼓励重用.像C++等面向对象语言中编程者仍然使用需要用大量细节来描述和操纵的基本的小单元工作.理论上可以开发强大的函数库包,并且如果这些函数库被广泛使用就将提高编程层次.然而,这样的函数库却很少.大多数面向对象语言的强类型使包的定义受限制从而难以重用.每个包都需要特殊类型的对象,如果两个包在一起工作,就必须写转换代码在两个包需要的类型间进行翻译.面向对象语言的另一个问题是他们强调继承.当一个类借用为另一个类写的代码时执行继承并不是一个好主意,它使软件难以管理和重用.它把类的执行绑在一起,因而没有另外一个类任何一个其它类都不可理解:不知道其继承的方法在父类中如何执行,则无法理解子类;而不知道其方法如何被子类继承,则无法理解父类.在一个复杂的类继承中,不理解它所继承的所有其他的类就无法理解任何一个类.更糟的是,一个类无法从它继承的类中被分离以用于重用.多重继承使这个问题变得更麻烦.执行继承导致和goto语句被重复执行时所看到的一样的交错和不可靠.因此,面向对象系统经常不能处理复杂问题并缺少重用.
另一方面,脚本语言实际引起了有效的软件重用.在有趣的组件由系统程序设计语言建立使他们使用了模块,随后用脚本语言把他们胶着在应用程序中.这种劳动的分割提供了为重用的自然的框架结构.组件被设计为可重用的组件和脚本间有定义好的接口以利于组件的使用.例如,在Tcl中组件是C中执行的常规命令.他们看起来更象是内在的命令,因而更容易在Tcl脚本中使用.在Visual Basic中组件是ActiveX的扩展,可用于从工具面板直接拖到窗体中.
不管怎么样,面向对象编程至少提供了两个有用的特性.第一个是封装:对象用某种隐藏执行细节的方法把数据和代码联系起来.这使管理大型系统更加容易.另一个有用的特性是接口继承,这涉及提供同样方法的类和APIs,即使他们有不同的执行,这时类之间可以相互转化,从而鼓励重用.
幸运的是,对象的这些好处在脚本语言中可以像在系统程序设计语言中一样实现,并且所有的脚本语言都提供面向对象编程.例如,Python是面向对象脚本语言,Python第五版包括提供对象,Object Rexx是Rexx的面向对象版本,而Incr Tcl是Tcl的面向对象版本.有一点不同是,脚本语言中的对象事物类型的,而系统程序设计语言中的对象是强类型的.
7.其他语言
这篇文章不是所有编程语言的全部特性记述.除了类型长度和编程层次以外还有许多编程语言的其他特性,并且还有许多不能被明确定义为系统程序设计语言或脚本语言的其他有趣的语言.例如,Lisp系统的语言就处于脚本语言和系统程序设计语言之间,两方的特性它都有一些.它开创了像解释和活动类型等现在在脚本语言中很普遍的观点,又有自动存储管理和综合开发环境等在脚本和系统程序设计语言中同时使用的观念.
8.结论
脚本语言代表一套与系统程序设计语言不同的协定.他们牺牲执行速度和与系统程序设计语言相关的类型长度而提供更高的编程创作力和软件重用.当计算机变得更快和比编程者的劳动力更便宜时这个协定越来越行得通.在复杂的数据结构和算法中系统程序设计语言也适于创建组件,而脚本语言更适合在联系复杂的应用程序中进行胶着.胶着工作变得越来越盛行,因而脚本在下个世纪将成为比今天更为重要的编程范例.
我希望这篇文章可以在三个方面影响编程群体;
★在开始一个新的项目并为每个工作选择最强大的工具时我希望编程人员能考虑到脚本和系统编程的不同
★我希望组件框架的设计者能认识到脚本的重要性并确信框架不仅是创建组件的工具,同时也是把他们胶着在一起的工具
★我希望编程语言研究协会能转变他们对脚本语言的态度,并在将来帮助发展更强大的脚本语言.对语言设计者而言,提高编程层次应该是唯一重要的目标,因为他是提高编程者创造力的最重要的因素;强类型是否有助于达到这个目标还不清楚.
9.答谢
这篇文章得益于很多人的观点,包括Joel Bartlett, Bill Eldridge, Jeffrey Haemer, Mark Harrison, Paul McJones, David Patterson, Stephen Uhler, Hank Walker, Chris Wright,IEEE计算机执行官,和许多热心参与这篇文章早期草稿网上新闻组讨论的人.Colin Stevens 写了MFC按钮例子的版本,Strphen Uhler写了Java版本.