Python与Perl不能说的秘密
最近想学一下Python,同时也想了解了下perl,就到处找了找相关的资料,以下内容都是我在网上找的,版权归原作者所有。
一、简介
1、 Python
Python的创始人为Guido van Rossum。1989年圣诞节期间,在阿姆斯特丹,Guido为了打发圣诞节的无趣,决心开发一个新的脚本解释程序,做为 ABC 语言的一种继承。之所以选中 Python(大蟒蛇的意思)作为程序的名字,是因为他是一个Monty Python的飞行马戏团的爱好者。
也许他并没有想到今天Python会在工业和科研上获得如此广泛的 使用。著名的自由软件作者Eric Raymond在他的文章《如何成为一名黑客》中,将Python列为黑客应当学习的四种编程语言之一,并建议人们从Python开始学习编程。这的确是 一个中肯的建议,对于那些从来没有学习过编程或者并非计算机专业的编程学习者而言,Python是最好的选择之一。
易用与速度的完美结合Python是一种用起来很方便的语言,很多初学Java的人都会被Java的CLASSPATH搞得晕头转向,花上半天的时间才搞 明白原来是CLASSPATH搞错了自己的Hello World才没法运行。用Python就不会有这种问题,只要装上就能直接用。
Python是一种脚本语言,写好了就可以直接运行,省去了编译链接的麻烦,对于需要多动手实践的初学者而言,也就是少了出错的机会。而且Python还 有一种交互的方式,如果是一段简单的小程序,连编辑器都可以省了,直接敲进去就能运行。Python是一种清晰的语言,用缩进来表示程序的嵌套关系可谓是 一种创举,把过去软性的编程风格升级为硬性的语法规定。再不需要在不同的风格间选择、再不需要为不同的风格争执。与Perl不同,Python中没有各种 隐晦的缩写,不需要去强记各种奇怪的符号的含义。Python写的程序很容易懂,这是不少人的共识。Python是一种面向对象的语言,但它的面向对象却 不象C++那样强调概念,而是更注重实用。不是为了体现对概念的完整支持而把语言搞得很复杂,而是用最简单的方法让编程者能够享受到面向对象带来的好处, 这正是Python能像Java、C#那样吸引众多支持者的原因之一。
Python是一种功能丰富的语言,它拥有一个强大的基本类库和数量众多的第三方扩展,使得Python程序员无需去羡慕Java的JDK。Python 为程序员提供了丰富的基本功能使得人们写程序时用不着一切最底层做起。说到这里,人们通常会用一种担心:脚本语言通常很慢。脚本语言从运行的速度讲的确会 慢一些,但Python的速度却比人们想象得快很多。虽然Python是一种脚本语言,但实际上也可以对它进行编译,就象编译Java程序一样将 Python程序编译为一种特殊的ByteCode,在程序运行时,执行的是ByteCode,省去了对程序文本的分析解释,速度自然提升很多。在用 Java编程是,人们崇尚一种Pure Java的方式,除了虚拟机一切东西都用Java编写,无论是基本的数据结构还是图形界面,而Pure Java的SWING,却成为无数Java应用开发者的噩梦。Python崇尚的是实用,它的整体环境是用C来编写的,很多基本的功能和扩展的模块都是用 C/C++来编写的,当执行这一部分代码时,它的速度就是C的速度。用Python编写的普通桌面程序,其启动运行速度与用C写的程序差别不大。除了这 些,通过一些第三方软件包,用Python编写的源代码还可以以类似JIT的方式运行,而这可以大大提高Python代码的运行速度,针对不同类型的代 码,会有2倍至100倍不等的速度提升。
2、 Perl
Perl是Practical Extraction and Report Language(实用摘录和报告语言)的简称,是由Larry Wall所发展的。Perl 最初只是 Unix 系统管理员的一个工具,在工作日里被用在无数的小任务中。从那以后,它逐步发展成为一种全功能的程序设计语言,特别是在各种计算平台上,它被用作 Web 编程、数据库处理、XML 处理以及系统管理 —— 它能够完成所有这些工作,同时仍然是处理小的日常工作的完美工具,这是它的设计初衷。Perl 快速、有趣,而且特别有用。很多人因为需要 Perl 而使用它,又因为热爱它而继续使用它。
Perl是一门自由且功能强大的编程语言。自 1987 年初次登台亮相以来,它的用户数一直急剧膨胀。从最初被当作一种在跨平台环境中书写可移植工具的高级语言开始,Perl 就已经被广泛地认为是一种工业级的强大工具,可以在任何地方用来完成你的工作。 Perl 特别适合系统管理和 Web 编程。Perl 实际上已经被所有 Unix(包括 Linux )捆绑在一起作为标准部件发布,而且也被广泛用于 Microsoft Windows 和几乎所有其他操作系统。Amiga、Be OS、VMS、MVS? 和 Apple Macintosh 等也只是 Perl 已经完成移植的平台的一小部分。
Perl的解释程序是开放源码的免费软件,使用Perl不必担心费用。Perl能在绝大多数操作系统运行,可以方便地向不同操作系统迁移。
Perl 是一种能完成任务的语言。从一开始,Perl 就设计成可以把简单工作简单化,同时又不失去处理困难问题能力的语言。它可以很容易操作数字,文本,文件和目录,计算机和网络,特别是程序的语言。这种语言应该很容易运行外部的程序并且扫描这些程序的输出获取感兴趣的东西。而且它还应该很容易能把这些你感兴趣的东西交给其它程序做特殊的处理。当然,这种语言还应该很容易在任何现代的操作系统上可以移植地编译和运行。
二、比较(绝对没有谁好谁坏,不要喷我)
Perl
设 计之初就是为了方便编写复杂高效的系统脚本,它也是应该最为广泛的脚本编程语言。它在编程方面相当于瑞士军刀,对字符、文本文件处理能力很强,以前要求 shell+sed+awk+C才能完成的任务,只需perl脚本就可以完成了。而且应用领域一直在拓宽,支持面向对象程序设计。
Python
面向对象的动态公共语言,适于脚本编程和快速开发,它最显著的特点是作为编译语言(如C)和脚本语言(如perl)之间的桥接语言,它具有的强大功能,可扩充性及面向对象的特征使其成为大规模应用程序开发工具。
关于强类型
Perl语言中,数据的类型,取决于数据所处的上下文。Python语言中,数据类型,是数据自身确定的。Python因此一般被认为是强类型语言,而Perl则不是,不过Perl的爱好者一般不关心这种事情。实际上,换个角度来看,Python是固定的数据类型,变化的函数类型;而
Perl则是固定的函数类型,变化的数据类型。都很有意思。
关于 内置基础类型
Perl的基础类型叫做scalar,这是为了和后面的array和hash做区别。scalar可以是数字,也可以是字符串。基本上说,scalar非此即彼;换句话说,scalar既是数字,又是字符串。scalar到底是字符串,还是数字,完全取决于使用scalar的上下文,如果是一个处理字符串的函数,那么它是字符串;如果是一个处理数字的函数,那么它是数字。Perl会尽一切努力完成它们之间的转化,无论在你看来有多么荒诞。
Perl中,所有scalar都以$开头,所有以$开头的都是scalar。
Python的基础类型,同样,不是数字,就是字符串。但是,不可能既是数字,又是字符串。Python会判断变量到底是数字,还是字符串,以此来选择怎么解释函数;如果它找不到一个合适的解释,那么Python会抛出异常。一般来说,这种策略能够取悦一部分程序员,同时让另外一部分人感觉很不爽。
关于 复合类型
Perl有两种复合类型:array和hash。Python有三种复合类型:tuple,
list, dict。
Python中的tuple+list,完全对应于Perl中的array;因此不存在谁提供的
类型更丰富这样的问题。
关于 创建
Perl中创建array可以通过()。但是()到底是否会创建一个array,这取决于所处的上下文;换句话说,只有当上下文要求一个array时,()才会产生一个array。事实上,()可能创建一个scalar,也可能创建一个hash,这完全取决于上下文。
关于存取单个元素
Perl中我们可以用$foo[$bar]来表示foo这个array中的第$bar个元素。特别诡异的是,这个foo和$foo中的foo是完全不相干的,这回应了前面提到的Perl原则,一个符号到底什么意思,取决于上下文。并且,在$foo[$bar]这样一个上下文中,$bar会被Perl搞成整数,无论它本来是什么。
Perl中,用一个越界的idx访问array是完全正常的,Perl会悄悄的扩展array。Python中,tuple或者是list,两者都通过lst[idx]这样的形式存取其中的元素。
Python中,用一个越界的idx访问array会触发一个异常。
Python中,提供了强大的slice功能。
关于做为整体的list
Perl中,用@开头的名字表示整个array,据说是因为@是array的字头。但是,又根据Perl的原则,@foo这样的array也可以被使用到一个需要scalar的环境中去,Perl会尽力把@foo转换成一个scalar,一般来说,这个scalar就是@foo的长度。
Python中,直接使用变量名,就能获得整个list(或者tuple)。
关于历史:
Perl 的前身语言:C, awk, sed, sh, 以系统管理为目标, 强调使用性而不是美观(Perl最早的man page里提到); Python来源于ABC, 一种 同BASIC目标类似的语言,属于学习曲线比较平缓的那种。
Perl 直接创始自工作任务, Python是作者工作经验的总结.
Perl 早期属于UNIX文化;Python 建立在Amoeba这种实验性系统上.
Wall 是个有激情的基督徒, 所受的教育是语言学专业. Guido 是CS专业毕业, 没有听说有异常的宗教信仰.
Perl 的兴起是80末-90初, 到95年以后发展进入成熟阶段, 标志是CPAN和perl 5, 此时正是UNIX发展的一个高潮, linux, bsd还有许多商业系统大都从那时候开始, perl作为unix系统管理的便利工具,自然也得到了发展的机会,其应用领域和社区也得到扩展. WEB应用的发展,CGI使用perl. Python的兴起则晚的多, 属于90年代末期发展,到2000年以后才比较成熟, 但是适用的范围比较广泛,具有后发的优势. 不幸的是,python 遇见了java,即使在现在现在python和java所覆盖的应用领域(除了嵌入系统)都是差不多的, java以其简洁的语法和模型在sun, Oracle, ibm等大公司的推介下迅速成为网络程序设计的主流。 python在这个阶段只能作为非主流的语言存在, 和其他数百个程���设计语言的地位没有什么两样,当然程序界历来是主流和非主流并存发展,python的社区仍然在不断的扩大(可谓韬光养诲?)。 等人们疲倦了java以及java和c#(.net)的争执,语言的多样化浮上前台(语言多样化在技术上的原因应该是组件技术和虚拟机的发展,使得一个工程可以用多种语言实现),python, ruby, lua, lisp/scheme, ocaml等待都能吸引人们的眼光,python更因其简洁的语法和丰富的功能得到更多的青睐, 欣欣向荣。而此时perl的进展一直比较平缓。
三、总结
这里我列举的内容都是python和perl的皮毛,只是让大家知道这两种语言涞源,历史和主要用处,并不是教大家这两种语言。同时强烈鄙视:谁谁谁好,谁谁垃圾的观点!
没有最好的语言,只有最好的coder..............