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

提問

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

◆ 爲何動態語言多做爲輕量級的解決方案?

◆ LAMP爲何受歡迎?

◆ Ruby on Rails爲何會流行?

◆ 編程語言的發展趨勢是什麼?

講解

「剩下四種動態語言,咱們將之歸爲後臺腳本語言。」冒號說着畫了張圖表——



引號聽得仔細:「我記得您開始是把這些語言劃分爲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和敏捷開發風行之際)打造出的好的框架。

◆ 靜態語言與動態語言從語言特徵到運行環境都在逐漸融合。

◆ 程序員應該與程序語言同樣,既要有本身的專長,又要向通用化和全能化發展。

◆ 編程語言慣例用法、哲學理念和編程範式造成了語言的編程風格。web

相關文章
相關標籤/搜索