var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-333696-1']); _gaq.push(['_trackPageview']); _gaq.push(['_trackPageLoadTime']); (function() { var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s); })();
  • 2007年06月11日

    脚本语言局限性

    分类:

    与系统程序设计语言相比,不同的脚本语言为不同的工作而设计,这导致了语言间的根本不同。系统程序设计语言起源于像内存字等最初期的计算机元素,它为建立数据结构和算法而创建。相反的,脚本语言为胶着而设计:它们假设已经存在一套强大的组件,而它主要是把组件连在一起。系统程序设计语言使用强类型定义来帮助处理复杂事务,而脚本语言使用无类型定义来简化组件间的联系,并提供快速应用开发。

     

    系统程序设计语言

    是作为除汇编语言外的另一种选择而引入的。PascalCC++C#Visual Basic(VBBASICJava。在汇编语言里,实际上机器的每一个细节都被反映在程序里。每个状态代表一个简单的机器指令,而程序员必须处理像寄存器分配和程序调用顺序等低层细节。因此,用汇编语言编写和维持大型程序是很困难的。

     

    系统程序设计语言与汇编语言在两个方面有所不同:它是高层语言并且是强类型。“高层”意味着很多细节被自动处理以便编程人员可以写更少的代码而做同样的工作;第二个不同是类型设置。使用"类型"来说明信息的意义在它被使用前就被特殊化。在强类型语言中编程人员声明如何使用每条信息,并避免此信息被用于其他方式。在弱类型语言中信息应用是没有优先权限制:信息的意思完全由它的使用方法确定,而不是任何初始约定。

     

    确定类型由几个好处。第一,声明变量如何使用使大型程序更易于管理并区分那些必须被分别对待的变量。第二,编译器可以利用类型信息来侦测某些类型的错误,比如,试图把一个浮点值作为一个指针。第三,定义类型能使编译器更好的执行特殊代码。例如,如果编译器知道一个变量总是对整型值有效,那么他就可以产生一个整型指令来操纵这个变量;如果编译器不知道变量的类型,那么它就必须产生额外的指令在运行时检查变量类型。

     

    系统程序设计语言的强类型本质上阻止重用类型鼓励编程人员创建包含不相容接口的类型("接口很好,接口越多越好")。每个接口需要特别类型的对象,而编译器不允许接口使用任何其他类型的对象,即使那样有用。为了使用一个已经存在的接口的新的对象,就必须写转换代码以便在对象的类型和接口期望的类型间进行翻译。这反过来又需要重编译部分或全部分布式二进制形式的应用程序,在普通情况下这是不可能的。

     

    总之,系统程序设计语言被设计来处理与汇编语言相同的工作,即随机地产生请求。系统程序设计语言比汇编语言层次更高,类型更强。这就使请求产生更迅速并且处理更容易,除了在运行时有一点损失,图示1是汇编语言和其他几种系统程序设计语言的比较。

     

     

     

    脚本语言(Script languagesscripting programming languagesscripting languages

    是为了缩短传统的编写-编译-链接-运行(edit-compile-link-run)过程而创建的计算机编程语言。例如COMMAND.COMcmd.exeWindows PowerShellActionScriptVisual Basic for Applications (VBA) Visual Basic Script(VBS)ColdFusionPHPXSLTJavaScriptECMAScriptPerlPractical Extraction and Report LanguagePythonRubyTcl(Tool Command Language)。早期的脚本语言经常被称为批处理语言或工作控制语言。大多脚本语言共性是:良好的快速开发,高效率的执行,解释而非编译执行,和其它语言编写的程序组件之间通信功能很强大

     

    脚本语言假设已经存在了一系列由其他语言写成的有用的组件脚本语言不希望随机地产生请求,它希望主要是把组件接在一起。脚本语言常用于扩展组件特性,但它们很少用于复杂的算法和数据结构;这些东西常由组件提供。脚本语言有时涉及胶着语言或系统整体语言。为了简化连接组件的工作,脚本语言被设计为无类型的:所有的东西无论是看起来还是使用起来都是完全一样的,因此它们可以互换,代码和数据也常可互换。无类型语言使组件更容易连在一起。在使用时没有优先级限制,并且所有的组件及其值都用统一的方式描述。除此之外,任何组件和值都可以在任何情况下使用;为某一目的而设计的组件可以被用于设计者完全没有预见过的完全不同的目的。

     

        脚本语言一般都有相应的脚本引擎来解释执行。他们一般需要解释器才能运行。脚本解释器是脚本语言工作的核心,所有具体指令或是函数的执行都由它来完成,扩展项实现了与其它语言的接口,使脚本语言运行C/C++,java等函数成为可能;同时在用户具体应用中可以定义命令和函数,应用更加灵活;作为解释器它也提供了基本的内建指令或是函数,不同厂商、版本的解释器提供的内建命令(函数)可能不同。例如:Perl自身不能打开文件。和许多其它语言类似,Perl请求操作系统来打开文件。当然,操作系统可能拒绝打开,如权限问题,不正确的文件名等等。

     

    系统程序设计语言与脚本语言区别

    脚本语言和系统程序设计语言一样安全。当一个值被使用时脚本语言在最后一刻进行错误检查,而强类型在编译时发现错误这就避免了运行时的检查。然而提高效率的代价是限制信息如何使用:这导致了更多的代码和更不易改变的程序。

     

    脚本语言和系统程序设计语言的另一个重要不同是脚本语言是被解释而系统程序设计语言是被编译。被解释的语言由于没有编译时间而提供快速的转换。通过允许用户运行时编写应用程序,解释器使应用程序更加灵活。脚本语言不如系统程序设计语言效率高,部分是因为它们使用解释器而不是编译器,而且因为它们基本组件的选择标准是功能强大和易于使用而不是有效地对应基本硬件。例如,脚本语言经常使用长度可变的字符串,而同样的情况下系统程序设计语言使用对应一个机器字的二进制值;脚本语言经常使用哈希表,而系统程序设计语言使用变址阵列。

     

    脚本语言比系统程序设计语言平均一个指令可以做更多的工作。一个典型的脚本语言指令执行成百上千条机器指令,而一个典型的系统程序设计语言指令执行大约五条机器指令。部分不同是因为脚本语言使用翻译器,这不如系统程序设计语言中被编译的代码。但是主要的不同是因为脚本语言的初期操作有更强大的功能。

     

    总之,脚本语言被设计用于胶着应用程序,他们提供比汇编或系统程序设计语言更高层的编程,比系统程序设计语言更弱的类型,和解译后的开发环境。脚本语言牺牲执行速度来提高开发速度。

     

        脚本语言不是系统程序设计语言的替代品,反过来也一样。它们各自适合不同类型的工作。把胶着和系统合为一体,应用程序可以比脚本语言快5-10;系统程序设计语言将需要大量复本和转换代码来连接各块。而这直接使用脚本语言。对于复杂的算法和数据结构,系统程序设计语言的强类型使程序更易于管理。执行速度是关键。系统程序设计语言可以比脚本语言运行快10-20倍,因为它产生更少的运行时检查。

     

    在决定是否使用脚本语言或系统程序设计语言处理一项特殊任务时考虑以下问题:

    ★应用程序的主要工作是否是把已经存在的组件联系起来

    ★应用程序是否要操纵不同种类类型的事物

    ★应用程序是否包含图形用户界面

    ★应用程序是否做大量字符串操作

    ★应用程序函数是否能快速解决问题

    ★应用程序是否需要可扩展

    如果这些问题回答""就表明这个应用程序使用脚本语言会更好。

     

    另一方面,如果对下面的问题回答""就表明系统程序设计语言更适合这个应用程序:

    ★应用程序是否执行复杂的算法或数据结构

    ★应用程序是否操纵大量数据集(像图像中的所有像素)因而执行速度很重要

    ★应用程序的函数是否已经定义好,并且很少改动

     

    脚本语言代表一套与系统程序设计语言不同的协定。它们牺牲执行速度和与系统程序设计语言相关的类型长度而提供更高的编程创作力和软件重用。当计算机变得更快和比编程者的劳动力更便宜时这个协定越来越行得通。在复杂的数据结构和算法中系统程序设计语言也适于创建组件,而脚本语言更适合在联系复杂的应用程序中进行胶着。

     

    参考资料:

    ¡  Tcl-Tk中文网

    ¡  Tcl Developer Site

    ¡  脚本语言:21世纪的高级编程语言

    ¡  脚本语言-维基百科

    ¡  Windows NT-维基百科

    分享到:

    历史上的今天: