Perl、PHP、Python、Java 和 Ruby 比较【转载+整理】
从本文的内容上,写的时间比较早,而且有些术语我认为也不太准,有点口语化,但是意思到了。 问题: Perl、Python、Ruby 和 PHP 各自有何特点? 为什么动态语言多作为轻量级的解决方案? LAMP 为什么受欢迎? Ruby on Rails 为什么会流行? 编程语言的发展趋
从本文的内容上,写的时间比较早,而且有些术语我认为也不太准,有点口语化,但是意思到了。
问题:
-
Perl、Python、Ruby 和 PHP 各自有何特点?
-
为什么动态语言多作为轻量级的解决方案?
-
LAMP 为什么受欢迎?
-
Ruby on Rails 为什么会流行?
-
编程语言的发展趋势是什么?
“剩下四种动态语言,我们将之归为后台脚本语言。”冒号说着,画了张图表——
引号听得仔细,说:“我记得你之前把这些语言划分为 C 族静态语言、非 C 族静态语言和动态语言三类的。”
冒号解释:“那是按语法来划分的,偏重理论;现在是按应用来划分,偏重实践。”
句号立刻联想到:“这种分法貌似三层架构——前台语言对应表现层;平台语言和后台脚本语言对应业务逻辑层;系统语言对应数据层。”
“的确有几分神似,但千万不能混淆。”冒号提醒道,“三层架构是模块设计上的逻辑划分;而这里是按语言应用范围进行的物理划分——与用户交互的是前台语言,与机器交互的是系统语言,介于其中的为前台提供服务同时又需要底层系统服务的是后台语言。”
逗号,询问:“后台语言,又细分成平台语言与后台脚本语言?”
“这是基于程序与脚本、静态与动态而分的。”冒号说明,“其实 Perl,PHP,Python 和 Ruby 都有自己的虚拟机,从这种意义上,它们也可作为平台语言。但在实际应用中,它们没有 Java 平台和 .NET 平台那种整合凝聚力和核心作用,通常作为轻量级的解决方案。”
问号,想探个究竟:“这是由于它们都是动态语言的缘故吗?”
冒号,回答:“理论上动态语言同样能承担大型应用,但实践上它们多作为“胶水”语言或用于中小型应用。用句时髦的话来形容,暂时还是主流的配角或非主流的主角。毕竟在运行效率、类型安全、可用资源、开发工具、技术支持等方面,与 Java、C# 相比尚有一定差距。另外它们同属‘草根’语言,虽有开源社区的大力支持,在影响力上与后者不可同日而语。”
叹号,揣测:“说不定,在不久将来,动态语言也会成为主流的。”
“世易时移,殊难逆料。但有一点可以肯定,语言的发展趋势一定是动静结合、刚柔并济。”冒号断言,“一方面,以 Java 和 C# 为代表的静态语言中嫁接了动态语言的枝条;另一方面,以 Java 和 .NET 为代表的平台与动态语言的交壤地带也在逐步扩大。比如,JRuby 允许 Ruby 与 Java 之间互相调用,还有 Jython、IronRuby、IronPython 等。值得一提的是,动态语言最活跃的舞台当数 LAMP,L-A-M-P。”
引号,接过话茬:“L 是 Linux,A 是 Apache,M 是 MySQL,P 是 PHP。这四大组件形成了一个完整的开源网络开发平台。”
冒号,补充道:“P 也可指 Perl、Python,甚至 Ruby。”
逗号,调侃:“可惜 Ruby 的‘R’比‘P’多了一根尾巴。”
“有人为了自圆其说,干脆让 P 表示‘Programming language’,这下所有语言都囊括其中了。老外就喜欢玩这种首字母缩写的文字游戏,尤其是 LAMP 正好还有‘灯’的含义,寓意开源世界是一盏明灯,他们一定更得意了。”冒号边说边笑道,“前面我们曾提及,网络应用是生长动态语言最肥沃的土壤,而 LAMP 就是这块土壤上搭建的平台。作为网络平台,LAMP 以其开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等优势而与 Java 平台和 .NET 平台三足鼎立,特别受中小企业的欢迎。LAMP 中,Linux 是操作系统,Apache 是 Web 服务器,MySQL 是数据库系统,而我们当下最关心的是‘P 族语言’:PHP、Perl、Python 还有 Ruby。”
问号,建议:“作为动态语言,它们的共性上面已经谈了不少,能说说它们的个性吗?”
“它们的个性极为鲜明:Perl 凝练晦涩,Python 优雅明晰,Ruby 精巧灵动,PHP 简明单纯。先看老大哥 Perl,它博采众家之长,综合了 C 语言的结构、sed 的正则表达式、AWK 的关联数组(associative array)、Lisp 的表(list)和 Unix Shell 的命令,此外,它还借鉴了一种语言,你们知道是哪种吗?”冒号忽然卖起了个关子。
逗号,猜想:“应该是某种 OOP 语言吧。”
“Perl 中确有不少 C++ 的影子,但它的对象模型在 5.0 以后才引入,典型的半路出家,远不如前面的特征那么自然。与其说是一种自然而然的发展,不如说是在 OOP 潮流裹挟下的一种身不由己的迎合。真正深入骨髓的借鉴是自然语言。”冒号,给出了答案,“我们提过,Perl 发明者 Larry Wall 是一名语言学家,他认为程序语言应该与自然语言一样,简洁自然、易读易写、表达多样、不拘一格。Perl 还有不少的格言或哲学,使得编程语言一改严谨刻板的面孔,散发出浓郁的人文气息。”
叹号幽了一默:“我见过 Perl 代码,人文气息没闻出来,但我怀疑有乙醚气息——看一会就觉得晕晕乎乎的。”
众人大笑……
“有人仅用一行 Perl 代码就实现了 RSA 算法,你看了那还不得当场晕倒啊?”冒号打趣道,“Perl 各种魔符好似一把锋利的剪刀,做起文本裁剪之类的工作游刃有余。这是它最大的长处,当初 Perl 就是 Wall 用来做 Unix 系统管理的,以后在 CGI 上的广泛应用也得益于此。这也赋予 Perl 极强的粘合力,因而有‘internet上的胶带(duct tape)’的说法。它又号称瑞士军刀,精练而复杂,实用而强大。但Perl过于灵活*,缺乏规范,影响了程序的可读性、一致性、整洁性和可维护性。不熟悉该语言的固然如读天书,熟悉语言而不熟悉问题的也颇费思量。相比之下,Python 被认为是 Perl 有力的挑战者,不仅在于它天然的 OO 设计和丰富的类库,更重要的是它的友好度大大超过 Perl。Python 也有一系列的被称为禅(Zen)的哲学,不少与 Perl 针锋相对。比如,Perl 认为做一件事可以有多种方法,而 Python 认为一件事应该最好只有一种方法;Perl 追求语言的表现力,Python 追求简单优雅;Perl 喜欢隐性暗示,Python 强调显性明示;Perl 强调紧凑,Python 强调松散;Perl 语法和语义丰富,Python 语法和语义简单,类库丰富。或许 Python 最让人不习惯的是它对空白符敏感性。”
引号,感到惊奇:“对空白符敏感?这个倒真怪异。”
冒号,见怪不怪:“虽然有点违反习惯,但非常符合 Python 一贯的规范简洁的风格——一方面,从语法上,保证了良好的编码风格;另一方面,每个代码块不再需要起始的大括号或 begin/end 之类,减少了的代码行数。顺便提一句,另外一种优雅的语言 Haskell 同样对空白符敏感,或许优雅正是来自对细节和规范的重视吧。此外,许多人抱怨 Python 中的自引用 self 太多,殊不知这也是它倡导显式表达的一种体现。总的看来,Python 主要的问题还是在性能效率上不尽如人意。”
叹号,好奇地问:“Ruby 怎么样?据说它将取代 Java。”
“不要轻言‘取代’二字。”冒号说道,“Java 没有取代 C++,也不会被 Ruby 取代,顶多是再分配。不过 Ruby 的确是门很可爱的语言,兼具 Perl 的表现力和 Python 的可读性。Ruby 背后最具特色的理念是:关注程序员使用语言时的感受超过语言本身的功能。通俗地说,上手的兵器比锋利更重要;文雅地说,应给予程序员更多的人文关怀。拿代码块(block)和迭代器(iterator)来说,虽然这不是 Ruby 首创,但其语法最为赏心悦目。Ruby 元编程能力特别强,也是它高度灵活的一种体现,但并不是所有人都喜欢这种风格。Ruby 主要弱点有两个:一个与 Python 类似,在性能上还有待提高;另一个是它的线程由用户空间(user space),而不是内核空间(kernel space)来管理,不能充分利用多核或多 CPU。真正让 Ruby 变得炙手可热的是 Web 应用框架 Ruby on Rails(RoR)的成功,它们还催生了 Java 平台上的 Groovy 语言和 Groovy on Grails 框架。RoR 奉行的 CoC(Convention over Configuration)和 DRY(Don’t repeat yourself )原则以及 MVC 架构看似了无新意,但与 Ruby 结合之后,便如一只猱身而上灵猫,立刻衬托出 Java 和 .NET 大象般的身影。”
逗号,有些怀疑:“框架竟然捧红了语言,框架真有这么重要吗?”
“如果 Web 应用中动态页面较少或业务逻辑不复杂,框架的价值并不大。以前 CGI 编程就是往 Perl 之类的代码中嵌入HTML代码,如同 Java 中的 Servlet;PHP 则单纯地在 HTML 代码中插入 PHP 代码,如同早期的 JSP。没有 MVC,也不管什么三层架构,更没有 ORM。但是——”冒号拖了个转折音,“一旦业务逻辑变得复杂,开发人员增多,手工作坊式编程开始捉襟见肘,引入框架这个流水生产线来提高生产力便是大势所趋。”
句号,不解:“我想 Perl、Python 和 PHP 一定也有不少框架,Java中的框架更是泛滥成灾,何以独独 RoR 脱颖而出?”
冒号,分析道:“正值 Web 2.0 和敏捷开发的概念流行之际,RoR 将 AJAX 与 Ruby 组合在一起成为绝佳的回应。以前各种 Web 应用框架是不少,但在 RoR 之前轻量级套餐式解决方案并不多。Perl 中 Catalyst、Python 中 Pylon,还有 PHP 中 CakePHP 等应是效仿之作。因此,RoR 出现的时机可说正当其时。此外,Perl 和 PHP 由于过于流行,反而有不少的历史包袱,人们习惯了将表示逻辑和业务逻辑编织在一起。至于 Java 企业解决方案,框架太多,搭配组合更多,增加了选择的难度。即使采用最常见的轻量级 SSH(Struts+Spring+Hibernate)组合,维护起来也比 RoR 繁杂得多。”
叹号,愈发担忧:“听这意思,Java 还是危险啊!”
“言之过早。”冒号不以为然,“首先,RoR 还有待进一步检验,目前无论是应用广度还是深度上尚无法与 Java 相提并论;其次,Java 在性能、安全等方面还是有不少优势,而这些对于大型和关键性的应用来说尤为重要。即使在中小型 Web 应用中,RoR 较之 PHP 还远为不及。”
问号接下话题:“PHP为何如此流行?”
“因为它简单、专一。”冒号答得很干脆,“与 Python 和 Ruby 一开始就定位通用语言不同,PHP 是专为网络而生的。同早期的 Perl 相似,PHP 起初主要起文本过滤器的作用,只不过 Perl 多处理文件流,而 PHP 多处理套接字流。PHP 语法简单,为网络应用度身定造,受到网络开发人员的追捧当在情理之中。它虽很实用很流行,但并不完美。比如,变量名大小写敏感,而函数名大小写不敏感;函数命名规则不一致;不支持 namespace 和 unicode;与 Perl 一样,它的对象模型不是先天的,直到 PHP 5 才真正完善;对线程支持不足;相比 Perl、Python 和 Ruby,它的功能稍显单薄等等。”
引号,突然想起:“我记得你以前提到,PHP 还能用于桌面应用。”
“不仅 PHP,Perl、Python 还有 Ruby,都能作为前台语言来开发命令行或图形界面的应用。同样地,VB、Delphi 和 JavaScript 也能作为后台语言。现代的程序语言既有自己的专长,又向通用化和全能化发展,以争取更多的生存空间。试想一下,现代的程序员又何尝不是如此呢?”言及于此,冒号收住话题,“语言简评告一段落,还有不少既有趣又有用的语言,在此就不一一评说了。我们看到,每种编程语言都有其独特的惯例用法和哲学理念,它们与编程范式一道形成了语言的编程风格。体悟愈深者编程语感愈强,思维与语言愈交融无碍,渐从必然王国走向*王国。”
逗号,满怀憧憬:“那是不是一种人剑合一的境界?”
“或许人器合一更准确吧,程序员可不能只会一种兵器哟。”冒号故意抠他的字眼,“现在请大家每人写一句对本节课的感言。”
众人沉思片刻,齐齐挥笔而就——
- 叹号——没有最好的语言,只有最合适的语言。
- 逗号——没有糟糕的语言,只有糟糕的程序员。
- 问号——没有一种语言是万能的,只会一种语言是万万不能的。
- 引号——废除对语言的宗教信仰,建立对语言的哲学思维。
- 句号——编程就是在人脑和电脑之间寻找最佳平衡点的过程。
冒号读罢大悦,顺手一掌拍出五记马屁:“精彩之极!可谓字字珠玑、句句联璧啊。兹决定,给诸位的奖赏是——立时下课!”
众人欣然领赏而去。
总结
- 比起 Java 平台和 .NET 平台,动态语言轻便灵活、开发效率高,但整合凝聚力不够,在运行效率、类型安全、可用资源、开发工具、技术支持以及影响力等方面也有一定差距,故通常作为轻量级的解决方案。
- LAMP 是由 Linux、Apache、MySQL 和包括 PHP、Perl、Python 或 Ruby 在内的脚本语言组成的网络开发平台,具有开放灵活、开发迅速、部署方便、高可配置、安全可靠、成本低廉等优点。
- Perl 精练、复杂、强大、灵活、*、隐晦、表现力强,但规范性、可读性、一致性、整洁性和可维护性较差。
- Python 优雅规范、简洁明晰、易学易用、类库丰富,但效率稍差,有些人不喜欢它对空白符敏感的特性。
- Ruby 语法精巧、高度灵活,兼具 Perl 的表现力和 Python 的可读性,尤其注重程序员的感受,但其性能和线程模型尚有待改进。
- PHP 简单、专一、实用、流行,在但相比其他三种语言,在语法和功能上稍有欠缺。
- RoR 是一种轻量级套餐式的web应用解决方案,是由好的设计(MVC架构和CoC、DRY原则)加上好的语言(Ruby)在好的时机(Web2.0和敏捷开发风行之际)打造出的好的框架。
- 静态语言与动态语言从语言特征到运行环境都在逐渐融合。
- 程序员应该与程序语言一样,既要有自己的专长,又要向通用化和全能化发展。
- 编程语言惯例用法、哲学理念和编程范式形成了语言的编程风格。
下一篇: 推荐10款菜单源码(收藏)
推荐阅读
-
Perl、PHP、Python、Java 和 Ruby 比较【转载+整理】
-
[3月1日快讯精选]:PHP、Perl、Python、Ruby功能比较
-
使用 Python、Perl、PHP、Ruby 等脚本语言开发 Web 程序,跟使用 Java 开发 Web 程序相比有什么优势?
-
使用 Python、Perl、PHP、Ruby 等脚本语言开发 Web 程序,跟使用 Java 开发 Web 程序相比有什么优势?
-
[3月1日快讯精选]:PHP、Perl、Python、Ruby功能比较
-
使用 Python、Perl、PHP、Ruby 等脚本语言开发 Web 程序,跟使用 Java 开发 Web 程序相比有什么优势?
-
Perl、PHP、Python、Java 和 Ruby 比较【转载+整理】
-
perl、php、python、java和ruby的比较
-
java - PHP或者python进行数据采集和分析,有什么比较成熟的框架?
-
Perl、PHP、Python、Java和Ruby的比较