




已阅读5页,还剩2页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
脚本语言:21世纪的高级编程语言Sun公司 John K. Ousterhout著 武占春 编译随着计算机速度的提高以及对应用快速变更的要求,脚本语言变得越来越重要了。与系统编程语言不同,脚本语言的作用是把应用“沾”在一起,从而使得它们比系统语言能够更快的开发出应用程序来。脚本语言的设计初衷与系统语言是不同的。系统语言的目的是从无到有编写数据结构和算法,例如从利用内存里的一个word开始。与之相反,脚本语言的目的是“粘连”。脚本语言假设已经存在一批功能强劲的组件,而脚本语言则把它们连接在一起。系统语言是强类型语言,这样才能有效管理程序的复杂性。而脚本语言是无类型的,这样才能简化组件之间的连接,提高开发速度。系统语言和脚本语言是互补的。1960年代以来的计算平台都包括了这两种编程语言。这些语言同时在一个组件框架下使用:组件由系统语言编写,再用脚本语言粘连在一起。但是近年来的一些趋势,使得脚本语言变得越来越重要了。这些趋势,如运行更快的机器,GUI的发展,更好的脚本语言,Internet的迅速发展、良好的组件框架等等。这些趋势在下个十年还会是主旋律,今后,很多的应用完全是由脚本语言编写的,而系统语言则只是用来开发应用组件。系统编程语言要想理解脚本语言和系统语言的区别,最好还是先回顾一下系统语言的发展历程。系统语言的出现是为了替代汇编语言。使用汇编语言编程,程序需要反映机器硬件的各个方面,汇编语言的每个语句都代表了一条机器指令,程序员需要处理诸如寄存器、过程调用顺序等底层问题。结果是,编写和维护汇编语言程序非常困难。1950年代后期,高级编程语言,如LISP,FORTURN,ALGOL开始出现。这些语言的语句不再与机器指令一一对应,而是由编译器负责把语句转换成一系列二进制指令。经过一段时间的发展,出现了一系列系统语言,从ALGOL,到PL/1,PASCAL,C,C+和Java。系统语言没有汇编语言那样高效,但能够很快的编写出应用程序来,所以后来系统语言实际上几乎完全取代了汇编语言。高级语言系统编程语言与汇编语言的差异体现在两个方面。系统编程语言是高级语言,是强制类型的。所谓“高级”指的是很多细节是被自动处理的,所以程序员只需编写较少的代码就能完成任务。例如:寄存器分配由编译器处理,这样程序员就不用编写程序让信息在寄存器和内存之间移动。进程调用是自动生成的,程序员不必为在堆栈中移动参数而劳神。程序员使用简单的关键字如while和if进行程序结构控制,编译器生成所有详细的指令去实现这些控制结构。平均而言,一行系统编程语言可以等效为5行机器指令,而汇编语言中一行程序等于一行机器指令。(在一次非正式分析中,我发现一行C程序等效于37行机器指令。Caper Jones的数据是36)。一个程序员不管用什么语言编程,他一年能写出来的代码行数是一定的。因此,使用高级语言能够比汇编语言更快的开发出应用来。类型化汇编语言与系统编程语言的另一个区别是类型。我使用“类型化”(typing)这个词儿,用来表征信息在使用前被明确定义的程度。在强类型语言中,程序员需要定义每一个要用到的信息类型,防止这些信息另作它用。在弱类型语言中,信息不是预先被定义出来,而是在使用这些信息时才确定下来。现代计算机基本上都是无类型的。内存中的每个word可以保留任何一种类型的值,可以是Integer,floating-point,一个pointer或者是一个指令。值的含义是在使用的时候确定下来的。如果程序在内存的word中遇到了指针,则把它当作指令,如果一个word被引用Integer指令则它被当作一个整数。同一个word在不同时间被用作不同用途。与之相反,系统编程语言则是强类型的。例如:系统编程语言中的每个变量必须被声明为某种特定的类型,如integer或指向string的指针等。变量可以集合起来定义成为structs或者对象,里面有定义好的结构以及操作的方法一种类型的对象不可能被另一种对象使用。这种强类型是有它的优势的。首先,它让大型程序变得可管理。因为强类型明确了一个事务如何被使用,区分了事务本身及其使用方式。第二,编译器使用类型信息检测可能的错误,比如使用floating point作为一种指针类型就是错误的。第三,类型能够让编译器生成特定的代码从而提高了性能。例如,如果编译器知道一个变量经常保存的是integer值,编译器就可以生成一个整数指令去操作这个变量。如果编译器不知道这个变量是integer,那么它就要生成大量多余代码用于在运行时检测这个变量的类型。脚本语言脚本语言,比如Perl,Python,Rexx,Tcl,VB,Unix的shell等代表了与系统编程语言不同的语言类型。脚本语言假定一些有用的组件已经由其它语言编写完毕了。脚本语言不是从无到有地编写应用,而是把已有的组件组装起来。例如,tcl和VB能够把UI控件组合起来,Unix的shell脚本可以把过滤器程序组装到pipeline里。而且,脚本语言常常用来扩展组件的特性。但是,脚本语言很少用来编写复杂的算法和数据结构。脚本语言有时称为胶水语言或系统集成语言。脚本语言一般而言是无类型语言为了简化连接组件的任务,脚本语言一般是无类型的。无类型语言能够更容易把连接在一起。没有预先的限制约束事务如何被使用,所有的组件和值都使用统一的表示方式。组件可以用其在设计者想象不到的地方。例如,Unix的shell可以让所有的过滤器程序从输入读入一个字节流,然后写入一个输入流中。任何两个程序都可以把其中一个输入与另一个程序的输出连接起来。下面的一段shell命令中,可以把三个过滤器连在一起统计其中的文字“scripting”Select | grep scripting | wcSelect程序读取从显示而来的文本,打印到它的输出中;grep程序从它的输入中读取带有scripting的文本打印到它的输出中,wc则从中记录。强类型的系统编程语言则不鼓励重用,它鼓励的是每个程序员编写不兼容的接口,每个接口需要特定类型的对象,编译器要防止其接口被其它对象使用。为了使用新对象的接口,程序员需要编写转换代码。这就需要重新编译整个应用,而现今许多应用是以二进制形式存在的,这样的重新编译实际上是不可行的。我们利用下面的Tcl代码展示无类型语言的优势。button.b text Hello! fontTimes 16 command puts hello 这个命令创建了一个Button控件,能够显示一个16号大小的Times字,当用户点击这个Button时,一个短消息就显示出来了。这个命令包括了6个不同类型的事务:一个命令名称(button),一个button(.b),特性名称(-text, -font, -command),简单的字符串(Hello! hello), 一个字体名称(times 16),一个Tcl脚本puts hello。Tcl完全使用字符串表现所有上述事务。在这个例子中,特性可以用任意顺序定义,没有定义的特性使用缺省值。在这个例子中,有20个特性没有定义。这个例子用Java写得用两个方法,7行代码。用带有MFC的C+得写25行代码和3个过程。下面是C+中用于设定字体的代码就得象下面的代码这样CFont *fontPtr = new CFont();fontPtr-CreatFont(16,0,0,0,700,0,0,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH|FF_DONTCARE,“Times New Roman”);buttonPtr-SetFont(fontPtr)使用这么多行代码的原因是强制类型造成的。要设置button的字体,需要调用SetFont方法,但是这个方法必须传递来一个指向CFont的指针值。这就会建立并初始化一个新的对象,为了初始化CFont对象,它的CreatFont方法必须被调用。而CreateFont有个严格定义的接口,需要14个不同的参数。而在Tcl中不需要这些声明和转换。(当然在实战中,上面这个例子使用图形开发环境开发也不需要写这么多代码。)看上去脚本语言好像比较容易出错,其实实战中,脚本语言的安全程度和系统编程语言一样高。例如,上述tcl程序中字体的大小不是一个数字而是xyz时,系统是能够检测出来的。脚本语言在最后时刻才去检测错误,此时已经开始使用这些特性值了。虽然强类型语言在编译阶段就发现错误,减少运行时的消耗,但是这样的代价是增加限制,编写更多的代码,牺牲程序的灵活性。脚本语言是解释性语言与需要编译的系统编程语言相比,脚本语言的另一个特定是它是解释性语言。解释性语言使得在开发过程中编程可以不断反复,而不需要考虑编译的时间。解释器也能够运行程序在运行时有很大的灵活性。脚本语言没有系统编程语言那样有效率。一部分原因是因为这种语言需要在运行时进行解释,另一部分原因是脚本语言连接的是组件而不是直接操作硬件。例如,脚本语言经常使用可变长度字符串,而系统编程语言使用二进制值直接适应于一个机器word中,脚本语言使用哈希表而系统编程语言使用索引数组。幸运的是,脚本语言的性能问题不是关键问题。用于脚本语言的应用通常都不大,其性能常常取决于它所用到的组件,而这些组件常常是用系统编程语言编写的。由于脚本语言的一行代码能够做更多的事情,所以可以认为脚本语言是比系统编程语言更高级的语言。一行脚本语言语句可以等效成成百上千的机器指令。一部分原因是脚本语言使用解释器,而另一部分原因是脚本语言的原始操作符功能更强。例如,perl调用整数加和减的表达式是一样容易。在TCL中,一个变量带有一个追踪关联,如果设定一个变量的值反而会有副作用。例如,一个trace可能持续地在页面上更新一个变量。脚本语言使得粘结式应用开发成为可能。表一中描述了几种不同应用使用系统编程语言和脚本语言开发比较。可以看出,脚本语言开发的代码少,开发时间短,比例260倍。脚本语言的优势在首次开发时并没有优势。脚本语言的优势依赖于应用。在表一的最后一个例子中,GUI是用脚本语言,而模拟器则不是。表中的信息由comp.lang.tcl.newsgroup提供。不同的工作不同的工具。脚本语言不是系统编程语言的替代者。系统语言也不是脚本语言的替代者。它们完成的是各自不同的任务。对于粘接和系统集成,使用脚本语言开发效率会比是使用系统语言高10倍。而对于复杂的算法和数据结构,使用系统编程语言较好。如果执行速度是关键,那么使用系统编程语言可以提高1020倍的速度,因为不需要多少运行时的检查。在选择采用系统编程语言还是脚本语言之前,需要回答以下一些问题:l 应用是连接已有应用组件吗?l 应用要处理许多不同的事务吗?l 应用是否包括GUI?l 应用是否需要处理大量的字符串?l 应用是否需要应对大量的功能演化?l 系统是否需要开展?对上述问题的肯定性答案多,就需要使用脚本语言。另一方面,如果对下述问题的肯定性答案多,则需要使用系统编程语言。l 系统是否实现复杂的算法和数据结构?l 应用是否需要处理大的数据集,例如在一个图片中的pixel,而且处理速度很重要l 系统功能定义的很好,今后变化不会太大?在过去的30年里,大多数的计算平台都提供系统编程语言和脚本语言。例如,OS360上提供的工作控制语言JCL,虽然很原始,但能够使得OS360的工作步骤顺序执行。每个工作步骤用PL1,fortran或汇编编写的。1980年代的UNIX机器上,C是主要的系统编程语言,而csh则是shell脚本语言。在PC机时代,C和C+是主要的系统编程语言,VB则是脚本语言。在Internet时代,Java是系统编程语言,JavaScript、Perl、Tcl、Python、Ruby等等则是脚本语言。脚本语言和系统编程语言混合使用,功能是非常强大的。系统编程语言用来开发组件,脚本语言把他们拼装起来。例如,用C开发Active X应用,VB开发人员把这些应用拼装成VB应用。在Unix上,很容易编写shell脚本调用C应用程序。脚本语言正在崛起脚本语言已经存在了相当长一段时间了,但最近有些因素使得它们越来越重要。这些因素是GUI,Internet,和组件框架。GUIGUI首次出现是在1980年代。在许多开发项目里,GUI所占的开发工作量大约有整个项目工作量的一半。GUI从本质上看就是把应用粘连在一起。GUI开发的目的不是开发新的功能而是把一些GUI控件和应用连接在一起。任何一种基于C或C+的GUI工具集开发GUI时都显得笨拙、难于学习和难于扩展。所有好的GUI开发环境都是基于脚本语言的,例如VBInternetInternet的发展使得脚本语言得到广泛应用。Internet自身就是一个大的粘结工具。其自身不产生任何新的计算组件或数据,而是使得现有的所有应用变得可访问。对于许多Internet编程工作而言,最理想的语言就是把应用组件连接起来工作的语言,也就是脚本语言。例如,Perl被广泛用来编写CGI脚本,JavaScript则用来写网页。组件框架第三种面向脚本的应用是Active X和JavaBean。尽管系统编程语言对于构建新的组件很有效,但是组织的工作更适合于脚本语言。这部分地可以解释为什么组件框架在PC上用的多,而在UNIX上用的少,因为运行在PC机上的VB对这些组件框架的推广起到了推波助澜的作用。更好的脚本技术脚本语言也在不断的发展和完善中。Perl比起早期的JCL有了长足的进步。例如,JCL甚至都不能在UNIX Shell下提供基本的迭代。脚本语言的发展受益于计算机硬件速度的提高,今天的计算机速度是1980年代的100500倍,而且每18个月就提高一倍。今天,许多应用使用解释语言实现而没有显现出性能问题。计算机的速度越快,就越来越吸引大型应用使用脚本语言。业余程序员最后影响脚本语言发展的是程序员本身。20年前,大多数程序员都是非常专业和智巧的,一个程序员可以花费数月时间去掌握一门语言。系统编程语言是为这些人设计的。但随着PC时代的到来,越来越多的业余程序员出现了。对于这些人而言,编程不是主要工作,他们只是偶而写一些数据库查询或在spreadsheet上编一些宏。这些人不会花上好几个月学习系统编程语言,但却可以花几个小时学会脚本语言而开发一些应用。脚本语言很容易学习,它们语法简单,也没有对象、线程
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 六一快乐义卖活动方案
- 六一活动党日活动方案
- 六一活动定制活动方案
- 六一活动想法校内活动方案
- 六一活动方案及策划方案
- 六一海报公司活动方案
- 六一游园会活动活动方案
- 六一玩水特色活动方案
- 六一节员工活动方案
- 六一节活动创新活动方案
- 消防监理实施规划
- 检验批划分专项方案
- 外科学基本理论与实践智慧树知到答案章节测试2023年陕西中医药大学
- 2023子宫内膜异位症治疗指南
- TCIE 088-2020 非水冷板式间接液冷数据中心设计规范
- 工模外发管理流程模板
- 部编版高一上册语文第三课《百合花》课文原文教案及知识点
- 北京理工附中小升初分班考试真题
- 膀胱镜检查记录
- 二年级下册数学教案 《生活中的大数》练习课 北师大版
- T∕CAEPI 31-2021 旋转式沸石吸附浓缩装置技术要求
评论
0/150
提交评论