尽管媒体们如此关注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年第四季度Perl5.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的 PerlScript??可以让Perl在支持ASP的NT网络服务器,如Microsoft的IIS和O’Reilly的WebSite中的动态脚本引擎上运行。
除了核心的Perl语言解释器之外,ActiveState Perl的Win32??接口还包括特别针对Win32环境的模块。比如它提供了对自动操作对象的全面支持。随着越来越多的Windows系统资源和组件支持Perl端口,Win32版本的Perl将能够使用越来越多的系统功能。
扩展Perl的力量
和Microsoft的Visual Basic或Sun的Java不同,Perl没有一个巨大的公司为它撑腰。Perl最初是由Larry Wall开发并做为自由软件发布的。Larry后来开发Perl的工作是通过一个邮件组,在大概两百个合作者的帮助下进行的,这个邮件组叫做perl5- porters。最初这个邮件组是为了将Perl推向其他平台而建立的,但最终它成为开发Perl核心代码的贡献者们的聚集之处。
Perl5添加了一个扩展机制,独立的模块可以利用这个机制动态地加载到Perl程序之中。这导致了如今数百个附加模块的开发,其中许多重要的模块现在已经成为了Perl标准发行版本的一部分。附加的模块可以在综合Perl存档网络(CPAN)上得到。最好的进入CPAN的界面大概是[url]www.perl.com[/url],那里还包括许多书评,文章以及其他一些Perl程序员和使用者们关心的信息。
过去对使用自由软件曾经有的偏见,如今已经被粉碎了,因为人们认识到过去这些年来有许多最重大的计算机技术突破是从自由软件社区中产生的。 Internet本身很大程度上就是一个合作的自由软件项目,而且它的发展也是被那些自发组织的有远见的开发者所引导。类似的,在网络服务器平台中占有很大一块市场的是Apache,它也是一个自由软件项目,由大量的合作开发者社团创立,拓展和管理的。
除了持续不断的开发之外,Perl社区还通过新闻组和邮件提供活跃的技术支持。同时还存在无数咨询及付费的技术支持项目。无数的书籍提供了极好的文档材料,包括其中最著名的。Programming Perl,作者是Larry Wall,Randal Schwarz和Tom Chirstiansen。The Perl Journal和[url]www.perl.com[/url]提供关于一些最新进展的信息。
总的来说,由于巨大的开发者团体和自由软件社区合作的传统,Perl具有和可以和最大的公司媲美的开发和支持资源。
实际应用的案例
接下来的部分包括一些用户实际应用的例子,从那个很多系统管理员都很熟悉的快刀斩乱麻式的“Perl拯救那天”的故事,到一些更大的常用应用程序。有些故事是从1997年八月19-21号在San Jose,CA召开的第一届Perl年度大会上拿来的,在会议进展上找来的程序描述上面标上了作者的名字。
案例 1 - 拯救了Netscape技术支持的程序语言
Dav Amann (
[email protected])
好,我们来看看这个情况。你崭新的网络公司已经全面启动,你卖了多得超出你想象的浏览器,服务器和网络应用程序,你的公司大踏步的前进,最新的市场调查显示你的客户一年之内就已经超过了三十万。
现在唯一讨厌的问题是那三十万买了你的浏览器的家伙们可能会碰到点什么问题。他们可能不清楚到底他们要上的网在哪里,他们可能想要找人帮忙,他们可能想要找*你*来给他们技术支持。
当这种事情发生的时候,你大概会想:“好吧,那我写一些技术文章放到网上。”但是你开始着手这个计划的时候你会发现,你需要一种内容管理系统,一种发布系统,一些日志分析,然后收集和报告用户们在你的网站上的反馈,你早就该做这件事了。
幸运的是你知道Perl,然后你用Perl在三个月时间搞定了所有东西,仅仅靠了4个十分繁忙的技术支持工程师们的一些业余时间。
案例 2 - BYTE网站的快刀斩乱麻的转换
BYTE杂志准备要更新它自己的信息网络和会议系统,BIX,用这个系统编辑和读者可以交流各种信息。这个会议系统和Usenet很不同,倒和Mail- list有点像。可是许多BYTE的编辑都习惯用Usenet,因为他们一直订阅Usenet。因此BYTE建了一个接口,把BYTE内部的讨论组变成了 Usenet系统。使用的语言就是Perl,只用了几天的时间和不到一百行的程序。
案例 3 - 把客户的需求转到合适的专家那里
一个世界领先的计算机公司的性能测试小组想把用户需求的导航自动化。他们想利用企业内部网的设计解决这个问题,但是确没有任何经费预算。两个只有几周 Perl编程经验的工程师解决了这个问题。Perl脚本对查询的关键词进行自动匹配,然后将他们导航到他们要找的专家的网页。这个CGI程序不仅将客户指向他想找的专家页面和E-mail地址,而且自动把他的需求发送到专家那里。这个解决方案最终只花了短短几个星期,而且节省了很多预算。
案例 4 - email调查结果的收集和分析
一个Internet市场调查公司使用E-mail来做为调查手段,他们想对得到的一万个回复做自动化的分析。于是Perl又派上了用场。Perl脚本产生了SPSS的输入结果,虽然实际上Perl本身也可以用来做统计,如果这个统计学家会用Perl的话。
案例 5 - 跨平台的评测体系
SPEC(标准性能评测协会),一个评估计算机系统的工业协会,将他们的评测系统从SPEC92升级成SPEC95的时候,将主程序做了巨大的改动。他们希望能比较省力的让他们的系统能在UNIX以外的平台下运行。SPEC92系统是使用UNIX shell管理的,不可移植而且没法扩展。SPEC95系统则使用了一个用Perl写的可移植和扩展的管理引擎。这个程序充分利用了Perl的面向对象特性,Perl对C的拓展性,以及Perl的动态模块载入。将SPEC95移殖到Windows/NT平台很容易。移殖到VMS系统的主要难度则在于VMS 缺乏用户级别的fork方法。
案例 6 – 使用Perl工作的商业顾问
虽然很多年来我一直使用C语言工作,但是我发现再没有理由继续使用它了。我十年来的大部分工作都是获取、管理和转换信息,而不仅仅是数据。我参与开发的应用程序不过是带了图形界面的信息获取、管理和转化系统。Perl如今比任何其他的语言都胜任这项工作,不论是脚本语言还是系统编程语言。虽然我最开始只是使用Perl做为粘贴脚本和原型语言,但是现在我已经用它来干所有事情。它取代了我的C和UNIX shell程序。虽然,某些情况下我可能还是需要使用C语言,不过我希望Java最终将能够满足我的这些需求。
跨平台的GUI界面如今用HTML或本地运行上都做的很好,比如在企业内部网,或者是互联网上。
Perl提供了方便的数据结构接口以及商业数据库的界面模块。它为我提供了系统级的工具用于进程控制,文件管理,以及进程间通讯(只要有socket存在)。它让我可以用库,模块,包,还有子程序等等东西创建我的程序。它还可以让我写一些能够修改自身的程序,虽然看起来有点怪,不过有时候这个很必要。
Perl给我的最大好处在于我只需要原来五分之一的时间就可以完成一个复杂的任务。这个对于管理人员和客户都很有吸引力,不过最感兴趣的是那些为这个付钱的人。
案例 7 – Perl做为飞行数据分析的快速原型语言
Phil Brown, Mitre 公司高等飞行系统研发中心(CAASD)(
[email protected])
由于它的稳健和可塑性,它已经成为CAASD中很多程序员使用的工具,用来开发概念模型的快速原型。交通流管理实验室(T-lab)已经在使用数以百计的 Perl程序,从简单的数据界西和描点制图,到测算空间领域的复杂性,并计算飞行器传过这些领域的飞行时间。这些程序的大小从10行一直到1200行。因为许多这样的程序都高强度地使用I/O,因此Perl由于其多样地解析和搜索特性成为完成这些任务最自然的选择。
案例 8 – 在线专业打印
iPrint折扣打印与网络文具商店([url]http://www.iprint.com[/url])使用一种所见即所得的网络桌面发布程序,直接连结到后台的打印机,并且建立在一个复杂的实时多功能的产品与价格数据库技术之上。顾客来到这个网站,在线地建立,测试然后预定定制的打印物品,如名片,信纸,商标,邮票,以及其他东西,特别是一些广告。
iPrint系统包括一个前台系统(网站)和后台进程,免去了操作打印机需要的所有前期手工过程,并为iPrint会计系统提供所有需要的信息。这个系统里接近80000行的程序中95%都使用Perl v5.003写的,运行在WindowsNT4.0上。iPrint非常依赖RDBMS(SQL服务器),而所有与服务器的交互都是用Perl和ODBC 完成的。iPrint使用了包括MIME和Win32::ODBC在内的许多CPAN模块。
案例 9 – Amazon.com的作品编辑系统
Amazon.com使Perl开发了一个基于CGI的编辑作品系统,综合了写作(使用Microsoft Word或Emacs),维护(CVS版本控制和使用glimpse方法的搜索),以及输出(使用正规SGML工具)的整个流程。
作者先使用CGI程序建立一个SGML文档,填一个小表格,然后将在用户的home目录下产生一个部分完成的SGML文档,它也可以在Microsoft Windows中被加载。而后作者可以用自己喜欢的编辑器来完成这个文档。利用CGI程序,用户可以看到文档的变化(’cvs diff’)以及用HTML方式在递交之前看到他们的SGML文档(’cvs commit’)。作者可以用关键词搜索SGML库(使用glimpse方法),以及追踪版本变化(’cvs log’)。编辑们也可以利用CGI程序建立时间表。
Amazon.com建立了一个基本的SGML精简类,然后建立了一些子类来进行不同模式下对网站不同部分的提炼(含图片的HTML或没有图片的HTML,将来可能还有PointCast,XML,braille等等)。
所有的代码都是使用Perl写的。它使用了CGI以及HTML::Parser模块。
案例 10 – 新英格兰医院的特殊打印服务器
新英格兰地区的医院系统里使用了十二种操作系统,从大型机一直到个人电脑系统。同时存在七种不同的网络协议。有将近一万二千台PC和两千台同一型号的打印机,以及一千台特殊打印机。这个网络分布在整个城区,利用微波,T1,T3以及光纤。我们要做的事情是实现网络打印。由于特殊打印机是用来在每个专有网络中打印病人的注测和帐户信息的,它通过转有网络连结在IBM大型主机上。现在的目标是希望使用标准的协议利用标准的打印机来打印这些文档。
寻找了各种合适的可扩充打印服务系统之后,发现MIT Project Athena的Palladium可以做为不错的开发基础。不过它是独立打印服务器系统,不符合我们的要求,医院需要一种分布式的服务器。我们花费了两个月的时间希望将Palladium移殖到医院的平台上然后做些修改,但是最终我们发现这太不经济了。最后我们决定自己来建立我们要的系统,使用Perl做为核心程序,Tcl/Tk做GUI管理界面。Palladium有30000行源代码,而我们更复杂的分布式服务器系统只涌了5000行的Perl以及四个人月的工作量就完成了第一个版本。这个Perl程序在一台运行UNIX的60MHz的Pentium机器上运行的速度已经足够快,所以没有必要再用C 重写任何代码。
案例 11 – Purdue大学的网络计算中心
在将来,计算处理有可能采取以网络为基础的服务模式,类似今天的电力供应和电话系统的体系构架。这种模式需要一种能够利用网络访问软件与硬件资源的底层机制。为了实现这个功能,我们开发了一种基于网络的虚拟实验室(”The Hub”),可以让使用者利用Netscape这样的www浏览器访问和运行服务器上的软件。
The Hub是一个可以用www访问的各种模拟工具与相关信息的收集,它是高度模块化的系统,有接近12000行的Perl代码。它包含了几个组成部分:a)通过www访问的用户界面。b)提供访问控制(安全与隐私)以及任务控制(运行、中止,以及程序状态函数)。 c)支持逻辑(虚拟)资源组织与管理。在Hub上,用户何以:a)上载与操作输入文件。b)运行程序。 c)浏览与下载输出文件。所有过程都是通过www浏览器实现。其内部结构是一系列专门的服务程序(用perl5写成)组成的分布式实体。这些服务程序控制了本地和远端的软件与硬件资源。硬件资源包括任意的硬件平台,软件资源包括该平台上所有程序。(目前的版本还不支持交互式和基于GUI的程序)
The Hub允许各种工具根据它们的域被组织在一起并且可以交叉引用。资源可以通过一种特别设计用来描述工具与硬件特性的语言逐步地向这个系统添加。例如,一个新的设备可以仅仅通过描述它的型号,运行模式,操作系统等信息便很容易的添加到Hub系统中。类似地,一个新工具软件可以通过“告诉”Hub系统它的位置,输入方法(如命令行语句),可以运行在何种机器上(如Sparc5),以何种形式整合到Hub系统中(如电路模拟程序)等等信息来被整合进入Hub系统。这些工作通常可以在半小时内完成。
为了实现这种功能,Hub解析URL的方式和标准的面向文档的web服务器不同。URL的结构与底层的文件系统分离开来,而采用一种上下文敏感的方式解析(基于服务器上储存的用户详细状态),以此来完成虚拟帐户和自由存取控制。Lab引擎可以提供它的高性能计算能力给Hub系统随时调用。当一个用户请求运行一个程序时,lab引擎使用用户指定的输入文件来决定(通过人工智能子系统-同样是使用Perl编写的)使用哪些资源来运行,选择一个合适的平台(如工作站解决2-D问题,超级计算机解决3-D问题),将相关输入文件传到相应的平台,通过远端服务器启动程序。当计算结束之后,远端服务器提示lab引擎,然后取回输出文件,递交给用户。
最初的原型系统:半导体模拟Hub,包含来自四个大学的十三个半导体技术工具程序。在不到一年的时间里,超过250个用户进行了超过13000次的模拟运算。提供VLSI设计的Hub,计算机体系结构和并行计算技术也在最近几个月被添加进来。目前他们维护了十四个左右的程序。这些Hub系统现在在 purdue大学的一些本科生课程和研究生课程中被使用,同时也用来协助合作性的研究。经常使用这个系统的包括Puedue大学的一些学生和来自欧州和美国不同地区的一些研究人员。
Copyright ?? 2004 O’Reilly Media, Inc.