天天看點

Perl、PHP、Python、Java和Ruby的比較

預覽

◆ 語言的發展趨勢一定是動靜結合、剛柔并濟

◆ Perl凝練晦澀,Python優雅明晰,Ruby精巧靈動,PHP簡明單純

◆ 或許優雅正是來自對細節和規範的重視

◆ (RoR)與Ruby結合之後,便如一隻猱身而上靈貓,立刻襯托出Java和.NET大象般的身影

提問

◆ Perl、Python、Ruby和PHP各自有何特點?

◆ 為什麼動态語言多作為輕量級的解決方案?

◆ LAMP為什麼受歡迎?

◆ Ruby on Rails為什麼會流行?

◆ 程式設計語言的發展趨勢是什麼?

講解

“剩下四種動态語言,我們将之歸為背景腳本語言。”冒号說着畫了張圖表——

Perl、PHP、Python、Java和Ruby的比較

引号聽得仔細:“我記得您開始是把這些語言劃分為C族靜态語言、非C族靜态語言和動态語言三類的。”

冒号解釋:“那是按文法來劃分的,偏重理論;現在是按應用來劃分,偏重實踐。”

句号旋即聯想到:“這種分法貌似三層架構——前台語言對應表現層;平台語言和背景腳本語言對應業務邏輯層;系統語言對應資料層。”

“的确有幾分神似,但千萬不可混淆。”冒号提醒道,“三層架構(three-layer architecture)是子產品設計上的邏輯劃分[1];而這裡是按語言應用範圍進行的實體劃分——與使用者互動的是前台語言,與機器互動的是系統語言,介于其中的為前台提供服務同時又需要底層系統服務的是背景語言。”

逗号詢問:“背景語言又細分成平台語言與背景腳本語言?”

“這是基于程式(program)與腳本(script)、靜态與動态而分的。”冒号進行說明,“其實Perl,PHP,Python和Ruby都有自己的虛拟機(virtual machine),從這種意義上說它們也可作為平台語言。但在實際應用中,它們沒有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’,這下所有語言都囊括其中了。老外就喜歡玩這種首字母縮略(acronym)的文字遊戲,尤其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)[2]’的說法。它又号稱瑞士軍刀,精練而複雜,實用而強大。但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)來管理[3],不能充分利用多核或多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脫穎而出?”

冒号作出分析:“正值web2.0和靈活開發(agile development)的概念流行之際,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多處理檔案流(file stream),而PHP多處理套接字流(socket stream)。PHP的文法簡單,且為網絡應用度身定造,受到網絡開發人員的追捧當在情理之中。它雖很實用很流行,但并不完美。比如:變量名大小寫敏感而函數名大小寫不敏感;函數命名規則不一緻;不支援namespace和unicode[4];與Perl一樣,它的對象模型不是先天的,直到PHP 5才真正完善;對線程支援不足;相比Perl、Python和Ruby,它的功能稍顯單薄等等。”

引号突然想起:“我記得您在第一堂課提到PHP還能用于桌面應用。”

“不僅PHP,Perl、Python還有Ruby,都能作為前台語言來開發指令行或圖形界面的應用。同樣地,VB、Delphi和JavaScript也能作為背景語言。現代的程式語言既有自己的專長,又向通用化和全能化發展,以争取更多的生存空間。試想一下,現代的程式員又何嘗不是如此呢?”言及于此,冒号收住話題,“語言簡評告一段落,還有不少既有趣又有用的語言,在此就不一一評說了。我們看到,每種程式設計語言都有其獨特的慣例用法和哲學理念,它們與程式設計範式一道形成了語言的程式設計風格。體悟愈深者程式設計語感愈強,思維與語言愈交融無礙,漸從必然王國走向自由王國。”

逗号滿懷憧憬:“那是不是一種人劍合一的境界?”

“或許人器合一更準确吧,程式員可不能隻會一種兵器喲。”冒号故意摳他的字眼,“現在請大家每人寫一句對本節課的感言。”

衆人沉思片刻,齊齊揮筆而就——

歎号——沒有最好的語言,隻有最合适的語言。

逗号——沒有糟糕的語言,隻有糟糕的程式員。

問号——沒有一種語言是萬能的,隻會一種語言是萬萬不能的。

引号——廢除對語言的宗教信仰,建立對語言的哲學思維。

句号——程式設計就是在人腦和電腦之間尋找最佳平衡點的過程。

冒号讀罷大悅,順手一掌拍出五記馬屁:“精彩之極!可謂字字珠玑、句句聯璧啊。茲決定,給諸位的獎賞是——立時下課!”

衆人欣然領賞而去。

插語

[1] 有兩種三層架構,一種是three-layer architecture,一種是three-tier architecture。它們經常換用,但其實是有分别的:前者僅僅在邏輯進行劃分,而後者在實體上也進行了劃分——不同層次的子產品運作在不同的主機上。

[2] 不少地方譯作‘輸送帶’、‘傳送帶’,因為duct有‘輸送管’、‘導管’之意,于是想當然地認為這表明Perl在internet上起着輸送作用。殊不知‘duct type’專指一種萬能的粘性極強的膠帶,用以比喻Perl的粘合力。

[3] 這類線程被稱為綠色線程(green thread),也稱僞線程。據稱Ruby2.0将支援原生線程(native thread)。

[4] PHP将在5.3.0支援namespace,将在6.0支援unicode。

總結

◆ 比起Java平台和.NET平台,動态語言輕便靈活、開發效率高,但整合凝聚力還不夠,在運作效率、類型安全、可用資源、開發工具、技術支援以及影響力等方面也有一定差距,故通常作為輕量級的解決方案。

◆ LAMP是由Linux、Apache、MySQL和包括PHP、Perl、Python或Ruby在内的腳本語言組成的網絡開發平台,具有開放靈活、開發迅速、部署友善、高可配置、安全可靠、成本低廉等優點。

◆ Perl精練、複雜、強大、靈活、自由、隐晦、表現力強,但規範性、可讀性、一緻性、整潔性和可維護性較差。

◆ Python優雅規範、簡潔明晰、易學易用、類庫豐富,但效率稍差,有些人不喜歡它對空白符敏感的特性。

◆ Ruby文法精巧、高度靈活,兼具Perl的表現力和Python的可讀性,尤其注重程式員的感受,但其性能和線程模型尚有待改進。

◆ PHP簡單、專一、實用、流行,在但相比其他三種語言,在文法和功能上稍有欠缺。

◆ RoR是一種輕量級套餐式的web應用解決方案,是由好的設計(MVC架構和CoC、DRY原則)加上好的語言(Ruby)在好的時機(web2.0和靈活開發風行之際)打造出的好的架構。

◆ 靜态語言與動态語言從語言特征到運作環境都在逐漸融合。

◆ 程式員應該與程式語言一樣,既要有自己的專長,又要向通用化和全能化發展。

◆ 程式設計語言慣例用法、哲學理念和程式設計範式形成了語言的程式設計風格。

引自:http://developer.51cto.com/art/201107/277684.htm