请选择段落导航
1.Perl 语言的重要价值体现(1)
2.Perl 语言的重要价值体现(2)
尽管媒体们如此关注Java 和ActiveX,但真正“让英特网活起来”的却应该是Perl ,一种专业技术分析家们视而不见,但是却出现在所有网络 管理员、系统管理员或程序员脑中的语言。他们每天的工作包括建立常规的网络 应用,或是把不同的程序粘起来,以实现它们的设计者们没有预见到的功能。Sun的第一位网络 管理员Hassan Schroeder评论道:“Perl 是英特网的传送带/血管。”Perl 最初是由Larry Wall为unix 开发的一种脚本语言,其目的是为了将unix shell的易用性和编程语言(比如C)的强大功能与可塑性结合起来。Perl 很快成为了unix 系统管理员们的偏爱的语言。 随着World Wide Web的发展,Perl 的用途有了极大的拓展。公共网关接口(CGI)提供了在网络 服务器和程序之间传递数据并利用网页返回结果的简单方法。而Perl 则迅速成为了CGI编程的主要语言。 在功能强大的Win32移植版本出现之后,Perl 也有力地入侵,成为为NT系统的脚本语言之一,特别是在系统管理、网站管理与编程方面大显身手。 曾经,在主流的分析家们认为CGI程序和Perl 将会很快被Java ,ActiveX和其他新的专门为网络 开发的技术所取代。然而,他们没有料到的是, Perl 继续在发展壮大,Microsoft的Active Server Pages(ASP)和Apache服务器的mod_Perl 都支持在服务器上直接运行Perl 程序,以及数据界面如DBI,Perl DataBase界面,为后台数据库 与Perl 的整合提供稳定的API。 这篇文章探讨了为什么Perl 变得越来越重要的原因,不局限于网络 ,而是做为一种广泛用途的计算机语言。这些原因包括: Perl 这样的脚本语言与Java ,C++ 或C这样的传统程序语言适合的任务有着跟本的不同。 Perl 将许多程序“粘着”在一起的能力,或者说将一个程序的输出转化成另一个程序的输入的能力。 Perl 在处理文本方面无以伦比的能力,如正则表达式等强大特性。当网络 文本(HTML)重新兴起而成为所有应用软件和系统的网络 “外交语言”后,这一点变得尤其重要。 分布式的开发团队以一种以有机的、进化式的方式,跟随着快速变化的需求。 一种好的脚本语言应该是一种高级软件开发语言,既能够快速地开发小工具,同时又拥有开发复杂程序所需要的工作流与数据组织形式。执行速度一定要快。在调用系统资源如文件操作,内部进程通信,进程控制等方面一定要有效率。一种好的脚本语言应该可以运行在所有流行的操作系统上,适合信息处理(自由文本格式)和数据处理(数字与二进制数据)。它要可插入,可扩展。Perl 符合了上面所有的标准。 为什么/何时要用脚本语言? John Ousterhout在他的文章中有力地阐述道,脚本:二十一世纪的高层次程序语言。“像Perl 和Tcl这样的脚本语言代表了一种与C或Java 这样的系统程序语言非常不同的编程风格。脚本语言是被设计来“粘着”应用程序的;它们使用无类型的方法以达到比系统程序语言更高层次和更快捷的应用程序开发。计算机速度的提升和各种应用程序的混和与变化正使得在未来脚本语言变得越来越重要。” Ousterhout继续道:就在我们接近二十世纪的尾声的时候,人们编写程序的方法发生了一个跟本性的转变。这个转变是人们从C和C++ 这样的系统程序语言转向了Perl 或Tcl这样的脚本语言。虽然许多人正处于这样的转变之中,但很少人意识到了它的发生,更少有人明白它为什么在发生.... 脚本语言是被设计来完成与系统程序语言所不同的任务的,这导致了它们之间根本性的差异。系统程序语言的设计是从底层开始建立数据结构和算法,从最初级的计算机元素如内存单元开始。与之相反,脚本语言被设计用来做“胶着”的工作:它们假定已经存在很多有效的组件,然后将它们连接起来。系统程序语言使用严格的数据类型来控制复杂性,而脚本语言则没有数据类型,以便方便地连结组件并提供快速开发应用程序的能力。 脚本语言和系统程序语言是互补的,而且从60年代起主要的操作系统都同时支持它们。然而,近期的一些趋势,如更快的计算机、更好的脚本语言的出现,图形用户界面和组件体系结构的重要性不断增加,和英特网的发展,使得脚本语言的应用大大拓展。脚本语言将有越来越多的应用,而系统程许语言则主要被用来开发各种组件,这样的趋势在下个十年中还会继续。 系统管理员们是最早利用脚本语言的强大功能的人。任何一个操作系统中,都存在这种问题。一般是为了自动完成某种重复性的工作。即使Macintosh系统也需要一些用户定义的自动操作。任务可能很简单,比如自动备份和恢复系统,或者很复杂,比如周期性地储存硬盘上所有文件,或者存储二十四小时内所有系统设置的改动。有些时候已经有这样的工具可以完成这些工作,但自动操作需要有控制程序来启动它们,提取和转化它们的输出,以及协调这些程序的工作。 许多系统都内置了一些脚本语言,如VMS的DCI,MS-DOS的BAT文件,unix 的shell脚本,IBM的Rexx,Windows的 Visual Basic and Visual Basic for Applications,还有Applescripts都是专用于某种系统的脚本语言的好例子。Perl 的独特在于他打破了脚本语言与某个操作系统的紧密联系,而成为了一种在多个平台下广泛使用的脚本语言。 有些脚本语言,特别是Perl 和Visual Basic,或者算上Tcl和Python,都做为多用途的语言而被广泛使用。成功的脚本语言一个长处在于它们很容易调用操作系统功能/服务。更高一层次来说,做为一种多用途的脚本语言,它们必须稳健到你可以使用它们编写复杂应用程序的程度。脚本语言可以用来编写原型,建模和做测试,但当脚本语言运行足够迅速和稳健的时候,原型就直接成为了应用程序。 那么,为什么不使用那些多用途的程序语言如C,C++ 或Java 替代脚本语言呢?答案很简单:成本。开发时间比硬件和内存更昂贵。脚本语言容易学习并且使用起来很简单。 正如Ousterhout指出的,脚本语言通常没有什么数据类型概念。脚本不区分整数和浮点数,变量是没有类型的。这是脚本语言善于快速开发的原因之一。大概念是“不着急处理细节”。因为脚本语言擅长调用系统工具来做难做的事情(如拷贝文件和建立目录或文件夹),尚未实现的细节就可以用编译语言易于写成的小程序来处理。 对于编译语言来说数据类型有什么用呢?它使得内存管理更加容易,但对于程序员来说更难了。想想看:当FORTRAN流行的时候一个程序员赚多少钱一小时?内存值多少钱?而现在呢?时代变了。内存便宜,程序员很贵! 系统语言必须把任何东西都写出来,这使得编译复杂数据结构更容易,但是程序员更难编写。脚本语言尽量多地自己做出假定,尽量少地要求明确指定。这让脚本语言更容易学习,写起来也更快。其代价是编写复杂的数据结构和算法时很困难。但是Perl 在复杂数据结构和算法方面都做得很好,同时也没有牺牲写简单程序时的简便。 解释语言与编译语言 绝大多数脚本语言都是解释型语言,感觉上好像不适合大型程序项目。这种说法是应该要纠正的。 确实,除某些有硬件特异性的语言之外,大部分情况下解释型语言程序都比编译语言要慢。解释型语言的优势在于,它写的程序在解释器所能安装的任何系统上都可以运行。解释器负责处理那些系统特异性的细节问题,而不是应用程序本身。(当然也有例外,比如这个应用程序可能调用了某个不可移殖的系统特性) 操作系统命令解释器如MS-DOS的command.com以及早期版本的unix C shell是解释器运行的很好例子:脚本里的命令一条一条都喂到解释器里去。对于效率影响最大的就是循环:循环中的每一条命令在每次运行的时候都重新解释。有些人认为所有的解释型语言都这么...缓慢、低效、一次一行。不过事实并不是这样。 实际上有一些中间型语言,运行的时候被编译成某些中间码,然后被解释器装载运行。Java 就是一个例子,这让它成为了一种很有价值的跨平台语言。所有在不同硬件上的Java 解释器都能交流并共享数据和进程资源。对于嵌入系统来说这是非常棒的,因为嵌入系统实际上就是一种特殊目的的硬件。然而Java 并不是一种脚本语言。它需要数据声明,而且是预先编译的。(除非你把实时编译也算在内—虽然它实际上只是生成代码)Perl 也是一种中间型语言。Perl 代码根据需要一块一块地进行编译,所不同的是编译好的可执行部分被存在内存中而不是写成文件。任何一块Perl 代码块只被编译一次。Perl 在设计上的优势使得所有这些优化都很值得。Perl 保留了解释语言的可移殖性,又有了接近编译语言的执行速度。已经快经历了十年历史的Perl ,拥有数十万的开发者,现在又将经历它的五次脱胎换骨,它运行得既简洁又迅速。虽然在启动的时候可能会有一些延迟,因为需要一些时间编译代码,但是相对于代码执行的时间来说这很短暂。而且,像”fast CGI”这样的技术可以将反复执行的脚本镜像存在保留在内存中来避免启动延迟,除非这个脚本是第一次运行。 不管怎么说,Perl 5.005将有一个由牛津大学的Malcolm Beattie所写的编译器。这个编译器将消除编译过程中的启动延迟,并加入一些小的加速技术。它也消除了某些编写商业应用程序的程序员对脚本语言的生理恐惧。(使用编译器之后,其他人将无法再看到源代码) 信息处理与数据处理 互联网只是我们与计算机交流形式的许多巨大变化中的一个。这个改变在我们对工业的称乎中就能看得出来。过去它被称为“数据处理”,比如说:“如果我想中午拿到数据处理的结果的话,就得早上四点中把东西递交到数据中心去。”现在我们将它称为“信息服务”,比如“信息服务部的头正和我们的计划委员会一起工作”。兴趣和重点现在放在了“信息”而不是“数据”上。很明显,现在我们更关心信息,而信息往往同时包括文本和数据,而不仅仅是数据。Perl 在处理信息方面是很优秀的。Perl 处理信息方面的很大一部分能力来源于一种叫做正则表达式的特殊语法。正则表达式赋予了Perl 极大的处理和操作自由文本中的模式的能力。其他语言也有支持正则表达式的,(Java 甚至有自由/免费的正则表达式库),但是没有一种能像Perl 一样结合得这么好。 很多年以来,总的趋势一直都是将文本文件整合到特殊的应用文件格式中。唯有unix ,将ASCII文本定义为统一的程序文件交换格式,而其他的那些系统则让不兼容的文件格式越来越多。急剧扭转了这个趋势的,是互联网的出现。它的HTML数据格式是由有标记的ASCII文本组成的。由于互联网的重要性, HTML—以及与它相伴的ASCII文本—如今处在数据交换格式的中心地位,几乎所有的应用程序都可以输出它。微软甚至计划提供HTML方式的桌面。 HTML的继承者,XML(可扩展标记语言)如今已被广泛认为将成为混和环境下的标准文件交换格式。 HTML的强大显著地增强了Perl 的力量。它是种理想的语言,无论是在核实用户输入在HTML表格中的内容,操作大量HTML内容,还是提取和分析各种/海量log文件的时候。 这只是Perl 处理文本强大能力的一方面。Perl 不仅给你许多分解数据的方法,还给你许多将数据粘回一起的办法。因此Perl 在处理信息流并重新组装方面也很理想。可以很轻易地将信息转换后输入另一个程序或进行分析汇总。 有人说下一代的应用程序将不会是现在这些程序的样子,而是“信息化应用程序”,其中文本将构成大部分的用户界面。假想一个典型的企业内部网的应用程序系统:一个人力资源系统,雇员通过它来选择哪个公共基金会来投资他们的养老金,随时了解他们帐户里的数目,并取得相应信息来帮助他们投资。这个系统的界面将包含许多信息化的文档(一般是以HTML的形式),一些基于表格的简单CGI程序,以及到后台实时股票行情系统的链接(可能是英特网上的服务)。 利用传统的编程技术建立这样一个系统是很不实际的。任何一个公司的投资策略都会有不同,传统编程技术投入的巨大工作量在这样一个局限的项目里无法得到回报。而用web做为前台,利用Perl 脚本完成链接到后台数据库 的任务的话,你可能不需要很多时间就能完成这样一个系统。 或者来看看Amazon.com,它可能是最成功的新网络 经济的例子了。Amazon提供一个信息前台,以及一个后台数据库 和订单系统,然后——你猜对了——用Perl 将它们连在了一起。Perl 对数据库 的链接是由一组被功能强大的数据库 独立界面支持的,它们被称为DBI。Perl +fast-cgi+DBI可能是互联网上使用最广泛的数据库 链接/连接系统了。ODBC模块也可以提供类似功能。 考虑到Perl 强大的前台文本处理能力,以及后台的数据库 链接功能,因此你应该开始明白为什么Perl 在新一代信息化应用中会起到越来越重要的作用了。Perl 的模式匹配和处理功能在其他方面的应用包括生物医学研究,以及数据挖掘。任何大的文本数据库 ,从人类基因组计划的基因序列分析到某些大网站的日志文件分析,都可以用Perl 来处理。最终Perl 进一步被用来做基于网络 的研发和专门的英特网搜寻应用。在模式匹配和网络 socket开发方面的优势成为英特网的通讯方面的基石,也使Perl 成为建立网络 机器人的最佳语言,这些机器人用于在英特网上查找关键信息。 Perl 用来开发应用 开发人员越来越认识到Perl 作为一种应用开发语言的功用。Perl 使得传统语言没法做到的项目成为可能。并不只因为Perl 开发简单,它也可以足够复杂,在需要的时候甚至使用最高级的面向对象语言技术。 在编制基于socket的客户端-服务器应用程序的时候Perl 比C或C++ 要简单。用Perl 编写自由文本处理程序比任何语言都更简单。Perl 有一个由Perl 写成的成熟的调试器,以及许多选项可以用来建立安全的应用程序。几乎任何一方面的应用都有免费的Perl 模块可以使用,当需要的时候便可以动态加载。Perl 可以很容易的用编译好的C/C++ 甚至Java 写的函数进行扩展。这表明调用一些还没用Perl 写的功能或系统服务也很容易。当在非unix 系统下运行的时候,由于可以调用这个系统的特殊功能,因此这种拓展能力变得更加有价值。Perl 也可以在编译程序中被调用,或者被插入到其他语言编写的程序中。人们正在建立一种标准的方法,将Perl 整合到Java 中去,也就是说Java 的类将可以用Perl 来写。目前为止,这些程序需要内嵌Perl 解释器。不过1997年的第四季度O’Reilly & Associates的Perl 资源工具箱将包含一个新的后台编译器,将Perl 编译为Java 字节码以解决这个问题。 图形界面 由于Perl 是在unix 系统下开发的,ASCII终端是主要的输入输出设备(即使是像X一样的图形系统也包含了单独窗口的字符终端),因此Perl 并没有定义固有的图形界面(不过在今天这样群雄割据的图形界面的世界里这大概也算一种特性)。Perl 采用扩展模块来创见图形界面的程序。使用最广泛的就是 Tk,其实最早它是为Tcl脚本语言开发的图形工具包,不过很快就被移殖到了Perl 上。Tcl依然专注于X-Window系统,虽然她已经开始被移殖到微软的Windows系统上。 然而,如前所说,开发固有的图形界面已经变得不那么重要,因为web正逐渐成为多数应用程序标准的图形界面。“webtop”做为通用的跨平台应用正在快速的取代“desktop”。只要写一个“webtop”便可以用在unix ,Mac,Windows/NT,Windows/95…任何一个有网页浏览器的系统。 实际上,越来越多的网站采用Perl 和web来为一些传统的程序创建更简单易用的界面。比如Purdue大学网络 计算中心为三十种电路模拟工具设计了一个网页界面,使用Perl 从使用者填好的表格中提取数据并转化为命令行,发给Hub上连着的程序。 多线程 线程是做并行处理的很好的解决方法,尤其是当你在写双向通讯或事件驱动的程序的时候。1997年早些时候Perl 已经有了一个多线程的补丁。在97年第四季度Perl 5.005出现的时候,它将被整合进标准发布当中。Perl 一直支持的多任务模型是“fork”和“wait”。最小的调度单位是进程,它适用于unix 。Windows/NT的多线程机制并不太一样,因此 Perl 的可移殖性目前便受到了限制。不过如果在进程控制和其他应用之间建立抽象层,问题就解决了。而且,调和unix 和Win32系统Perl 接口的进程控制代码的工作正在进行,1997年的第四季度就会完成。 Win32系统上的Perl 6年,微软委托ActiveWare网络 公司(现在的ActiveState公司)为NT资源库创建一个Perl 与Win32系统的接口。如今网络 上到处都可以见到这个移植版本,据说接近一半的Perl 源代码下载都是用在Win32平台上的。Perl 进入像NT这样的Win32平台是有很多原因的。尽管有Visual Basic和Visual Basic for Apllications存在,Win32平台上的脚本语言支持依然比较弱。虽然vb 是解释型脚本语言,但它依然是一种类型化的语言,用起来比较繁琐。而且它也没有像Perl 那样强大的字符串处理能力。当建立大型NT站点的时候,系统管理员们则明显的认识到图形用户界面的限制,对于管理数百台计算机来说脚本语言是必须的。 很多时候会有这种情况,一些有经验的系统管理员常常被叫去管理那些不使用unix 系统的站点,这时使用Perl 是将unix 的优点带到其他系统去的好办法。 你也不能低估web的影响力量。现在网上有数以千计用Perl 编写的CGI程序和站点管理工具,支持Perl 对于任何服务器平台说都是必需的。对于 Microsoft的NT服务器来说,O’Reilly和Netscape更显得重要,对Perl 的支持是必须的。ActiveState的 Perl Script??可以让Perl 在支持ASP的NT网络 服务器,如Microsoft的IIS和O’Reilly的WebSite中的动态脚本引擎上运行。 除了核心的Perl 语言解释器之外,ActiveState Perl 的Win32??接口还包括特别针对Win32环境的模块。比如它提供了对自动操作对象的全面支持。随着越来越多的Windows系统资源和组件支持Perl 端口,Win32版本的Perl 将能够使用越来越多的系统功能。