預覽
◆ 語言的發展趨勢一定是動靜結合、剛柔並濟
◆ Perl凝練晦澀,Python優雅明晰,Ruby精巧靈動,PHP簡明單純
◆ 或許正是來自對細節和規範的優雅
◆ (RoR)與Ruby結合之後,便如一隻猱身而上靈貓,立刻襯托出Java和.NET大象般的身影
提問
◆ Perl、Python、Ruby和PHP各自有何特點?
◆ 為什麼動態語言多作為輕量級的解決方案?
◆ LAMP為什麼受歡迎?
◆ Ruby on Rails為什麼會流行?
◆ 程式語言的發展趨勢是什麼講
?剩下四種動態語言,我們將之歸為後台腳本語言。語言、非C族靜態語言和動態語言三類的。 「這種分法看似三層架構-前台語言對應表現層;平台語言與後台腳本語言對應業務邏輯層;系統語言對應資料層。」「的確有幾分神似,但千萬不可混淆。冒號提醒道,「三層架構(three-layer architecture)是模組設計上的邏輯劃分[1];而這裡是按語言應用範圍進行的物理劃分——與用戶交互的是前台語言,與機器交互的是系統語言,介於其中的為前台提供服務同時又需要底層系統服務的是後台語言。基於程式(program)與腳本(script)、靜態與動態而分的。也可作為平台語言。它們都是動態語言的緣故嗎?」冒號回答:「理論上動態語言同樣能承擔大型應用,但實踐上它們多作為粘合語言或用於中小型應用。還是主流的配角或非主流的主角。有開源社群的大力支持,在影響力上與後者未可同日而語。 ”「世易時移,殊難逆料。但有一點可以肯定,語言的發展趨勢一定是動靜結合、剛柔並濟。 」冒號斷言,「一方面以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潮流裹挾下的一種身不由己的迎合。者Larry Wall是一名語言學家,他認為程式語言應該與自然語言一樣,簡潔自然、易讀易寫、表達多樣、不拘一格。嚴謹刻板的臉孔,散發出濃鬱的人文氣息。乎乎的。
「有人僅用一行Perl程式碼就實現了RSA演算法,你看了那還不得當場暈倒啊?」冒號打趣道,「Perl的各種魔符好似一把把鋒利的剪刀,做起文本裁剪之類的工作來游刃有餘。因而有'internet上的膠帶(duct tape)[2]'的說法。它又號稱瑞士軍刀,精練而復雜,實用而強大。性、整齊性和可維護性。 OO設計和豐富的類別庫,更重要的是它對程式設計師友善度大大超過Perl。一件事可以有多種方法,而Python認為一件事應該最好只有一種方法;Perl追求語言的表現力,Python追求簡單優雅;Perl喜歡隱性暗示,Python強調顯性明示;Perl強調緊湊,Python強調鬆散; Perl的語法和語義豐富,Python的語法和語義簡單而類庫豐富。敏感?這個倒真怪異。每個程式碼區塊不再需要起始的大括號或begin/end之類的,減少了的程式碼行數。細節與規範的重視吧。人意。 Ruby取代,至多只是一種再分配。 不過Ruby的確是門很可愛的語言,兼具Perl的表現力和Python的可讀性。超過語言本身的功能。就拿程式碼區塊(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組合在一起成為絕佳的回應。 Perl中的Catalyst、Python中的Pylon還有PHP中的CakePHP等應是效法之作。不少的歷史包袱,人們習慣了將表示邏輯和業務邏輯編織在一起。 Struts+Spring+Hibernate)組合,維護起來也比RoR繁雜得多。 RoR還有待進一步檢驗,目前無論是應用廣度還是深度上尚無法與Java相提並論;其次Java在性能、安全性等方面還是有不少優勢,而這些對於大型和關鍵性的應用來說尤為重要。中小型web應用中,RoR較之PHP還遠為不及。和Ruby一開始就定位通用語言不同,PHP是專為網路而生的。處理套接字流(socket stream)。變數名稱大小寫敏感而函數名大小寫不敏感;函數命名規則不一致;不支援namespace和unicode[4];與Perl一樣,它的物件模型不是先天的,直到PHP 5才真正完善;對線程支援不足;比起Perl、Python和Ruby,它的功能稍顯單薄等等。 ,Perl、Python還有Ruby,都能作為前台語言來開發命令列或圖形介面的應用。現代的程序語言既有自己的專長,也朝向通用化和全能化發展,以爭取更多的生存空間。試想一下,現代的程式設計師又何嘗不是如此呢?」言及於此,冒號收住話題,「語言簡評告一段落,還有不少既有趣又有用的語言,在此就不一一評說了。我們看到,每種程式語言都有其獨特的慣例用法和哲學理念,它們與程式設計範式一道形成了語言的程式設計風格。體悟愈深者程式語感愈強,思維與語言愈交融無礙,漸從必然王國走向自由王國。 ”
逗號滿懷憧憬:「那是不是一種人劍合一的境界?」
「或許人器合一更準確吧,程式設計師可不能只會一種兵器喲。 」冒號故意摳他的字眼,「現在請大家每人寫一句對本節課的感言。 」
眾人沉思片刻,齊齊揮筆而就——
嘆號——沒有最好的語言,只有最合適的語言。
逗號——沒有糟糕的語言,只有糟糕的程式設計師。
問號-沒有一種語言是萬能的,只會一種語言是萬萬不能的。
引號-廢除對語言的宗教信仰,建立對語言的哲學思維。腦和電腦之間尋找最佳平衡點的過程。茲決定,給諸位的獎賞是-立時下課!”
眾人欣然領賞而去。
插語
[1] 有兩種三層架構,一種是three-layer architecture,一種是three-tier architecture。 ] 不少地方譯作'輸送帶'、'傳送帶',因為duct有'輸送管'、'導管'之意,於是想當然地認為這表明Perl在internet上起著輸送作用。萬能的黏性極強的膠帶,用以比喻Perl的黏合力。執行緒(native thread)。但整合凝聚力還不夠,在運作效率、類型安全、可用資源、開發工具、技術支援以及影響力等方面也有一定差距,故通常作為輕量級的解決方案。
◆ LAMP是由Linux、Apache、MySQL和包括PHP、Perl、Python或Ruby在內的腳本語言組成的網頁開發平台,具有開放靈活、開發迅速、部署方便、高可配置、安全可靠、成本低廉等優點。
◆ Perl精練、複雜、強大、靈活、自由、隱晦、表現力強,但規範性、可讀性、一致性、整潔性和可維護性較差。
◆ Python優雅規範、簡潔明晰、易學易用、類別庫豐富,但效率稍差,有些人不喜歡它對空白符敏感的特性。
◆ Ruby語法精巧、高度靈活,兼具Perl的表現力和Python的可讀性,尤其註重程式設計師的感受,但其效能和執行緒模型仍有待改進。
◆ PHP簡單、專一、實用、流行,在但相比其他三種語言,在語法和功能上稍有欠缺。
◆ RoR是一種輕量級套餐式的web應用解決方案,是由好的設計(MVC架構和CoC、DRY原則)加上好的語言(Ruby)在好的時機(web2.0和敏捷開發風行之際)打造出的好的框架。
◆ 靜態語言與動態語言從語言特徵到運作環境都在逐漸融合。
◆ 程式設計師應該與程式語言一樣,既要有自己的專長,也要朝向通用化和全能化發展。
◆ 程式語言慣例用法、哲學理念和程式設計典範形成了語言的程式設計風格。