2007年4月26日星期四

[ZZ]谈谈Web Mining研究者掌握动态脚本语言的必要性

发信人: xuqingyang (网事随风), 信区: SearchEngineTech
标 题: 谈谈Web Mining研究者掌握动态脚本语言的必要性
发信站: 水木社区 (Fri Mar 23 17:58:30 2007), 站内

自己平时很喜欢在闲暇时学习一些新的计算机语言,它使我对计算机的兴趣不至于在书写各种申报材料和论文中完全泯灭。特别是在我把工作平台转向Linux后,学习各种开源语言更成为自己掌握在Linux下工作的一种必然选择,除了C/C++、JAVA、C#这些主流开发语言外,我尤其对Perl、Python和Ruby这样的动态脚本语言情有独衷,这里特别谈谈自己在学习它们的过程中的一些体会。

第一次接触Perl语言是自己在作WebMining研究时从CMU大学的著名网页数据集Web-KB开始的,它的代码里有一些Perl语言脚本,往往几行代码就能完成JAVA这样的开发语言几十行代码才能完成的任务。显然它比Bash这样的Linux中的shell脚本功能要强大得多。由于第一次读到Perl语言书写的代码,感觉真的像天书一样难懂,特别是那些到处可见的$、@、%等奇怪的符号。为了完全弄懂Web-KB的这些代码,我下决心开始学习Perl,结果没想到从此一发不可收,很快就成为Perl铁定的忠实拥户。下面是我总结的几点它最突出的优点:

1。实用:
它像编码世界里的"瑞士军刀",很多常用的处理方式特别作了很大的简化,让你用最少的代码量完成最多的功能。在JAVA语言里你需要首先声明各种变量,在程序执行前需要进行编译,在ERL语言里这些都去掉了,这大大简化了程序开发人员的开发效率。在JAVA程序里即使你只是打印一行"HelloWorld"也要先定义一个类,再定义一个static voidmain函数作为程序调用的入口,在PERL程序中这些全都不必了;再比如从网上下载网页在JAVA语言里至少要写上几行的代码,在Perl里只用一句就可以: use LWP::Simple; $html =
get('http://www.sina.com.cn');由于经常需要引入package,所以选择use而不是JAVA里的import,因为它比后者少敲三个键。由于编程时90%的情况是处理文本,它就把正则表达式作为语言的内置功能而不像JAVA那样首先需要import re;在所有动态脚本语言中它也是运行速度最快的。

2。第三方类库有集中的CPAN网站及其镜像站点统一管理:
这是另一个让JAVA语言开发者嫉妒的优势,浏览一下网页http://search.cpan.org/吧,它把十年来所有开源的第三方软件包分门别类地集中存储,如果你愿意,也可以把自己开发的觉的有价值的软件包与全世界共享。JAVA虽然有Jarkata这样的第三方类库,但绝大多数还是需要我们自己去寻找。

3。它是最像自然语言的计算机语言,不要忘记它的作者以前曾经是一个语言学家,如果你牢记这一点,那学习Perl语言便容易得多。我认为Perl语言也是目前我学到的所有语言中最具创新性的语言(它直接影响了Ruby),深深影响了以后各种新的语言的设计。

4。它是完全开源的语言,它的作者是计算机历史上大名鼎鼎的Larry Wall,他发明了patch命令和一个新闻组阅读器,但更主要的是他发明了Perl和CGI动态网页技术,他对Web的迅猛发展有直接的影响力。如果你想学习一门很多年后依然保持生命力的语言,那最保险的办法就是学习一门开源的语言,因为如果你去学习Delphi这样的商业语言,等到Borland公司一旦在商业市场上份额下降,那这种语言可能就完全风光不再。现在最热门的语言JAVA是Sun公司的宠儿,虽然Sun公司总裁声称在今年年底会完全公开JAVA源码,但显然这门语言的发展完全掌握在商业的运营模式中。

Perl语言当然有它的缺点:不像Python和Ruby一样易学;面向对象功能不是一开始就设计而是后来添加的;代码可读性较差,过于灵活。Larry Wall在2000年每年一度的开源大会上宣称开发新一代perl语言(即Perl 6)的计划正式发始启动,它将摆脱现在向下兼容的包袱,从内核上对语言进行重新设计,采纳当下各门语言的精华同时保留它最根本的特性。这是让无数perl爱好者兴奋到整夜难眠的事情,现在开发Perl6还没有实现,这中间台湾的唐宗汉(现变性后改为唐凤)起了力挽狂澜的作用,是我们华人在开源领域最骄傲的人物。(见http://www.linuxeden.com/doc/21782.html)我认为学习像perl这样的脚本语言对计算机专业的研究者来说尤其适合,因为它可以大大加快开发原型或验证算法的过程,特别是它对文本处理的支持至今是无与伦比的。以我个人经验来说,作Web Mining研究有一个很漂亮的想法很容易,但想得到实验数据的支持必须经过大量的Coding,它占用整个过程99%以上的时间(只关心发论文不在意伪造数据的除外)。如果用C++或JAVA语言来实现,你要花大量的时间用在Debug上面,但用Perl这样的快速开发语言,只花费十分之一的精力就能将其搞定,它免去了声明和编译(包括make过程),同时由于有很多现成的第三方软件包可以使用(在cpan里很容易找到Naive Bayes,Support Vector Machine这些机器学习工具),它的功能却一点也不逊色。特别的,由于它的代码量只有前者的几分甚至十几分之一,debug也相对容易得多。另外,使用perl语言最好结合Unix/Linux系统(虽然它在跨平台特性上一点不比JAVA差),这更能发挥它应有的作用。事实上在Linux系统下Perl是必备的工具(很多系统管理命令甚至带窗口的程序都是用它编写的,比如synaptic),你甚至无须去安装它。

Python是另一个非常好的选择,它的好处是代码可读性好,对面向对象支持得非常好,非常易学(一个下午的时间可以学会80%场合用到的20%命令),另外与C/C++和Java的互相调用也作得非常出色(所以它是一种更好的glue language),还有一个Perl语言没有的交互式编译器,它类似于以前苹果机上的Basic,你可以无须编写程序而直接在终端一行行边输入程序边看到结果,所以非常有利于快速开发。它的作者现在为Google工作,据说Google很多的代码都是用Python书写的。Python的名字来自国外非常流行的一个黑色幽默电影,放假时中央电影频道还专门介绍过它(下次我再次学习它时会先那部电影看一遍,找找感觉),开源世界的一大特色就是这种无比轻松的幽默而不是像微软产品包含的那种浓浓的商业气息。

Ruby现在由于Ruby on Rails的流行而成为亲的上升之星,有人甚至预言它是未来的JAVA,它从Perl语言和Ada语言吸取了很多东西,自己打算有空闲时间的时候好好学习它。它的发明人是个日本人,有些中国程序员便排斥这门优秀的语言,我当然对此不会在意的。据说敏捷开发之父非常推崇这种语言,因为它是比JAVA还要纯的面向对象语言,像字符串和数学这些都作为对象处理,可以直接调用各种方法。可以想见,它也是速度最慢的动态脚本语言。但很多情况下这一点并不重要。

没有评论: