從本文的內容上,寫的時間比較早,並且有些術語我認爲也不太準,有點口語化,可是意思到了。程序員
問題:web
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 也能做爲後臺語言。現代的程序語言既有本身的專長,又向通用化和全能化發展,以爭取更多的生存空間。試想一下,現代的程序員又未嘗不是如此呢?」言及於此,冒號收住話題,「語言簡評告一段落,還有很多既有趣又有用的語言,在此就不一一評說了。咱們看到,每種編程語言都有其獨特的慣例用法和哲學理念,它們與編程範式一道造成了語言的編程風格。體悟愈深者編程語感愈強,思惟與語言愈交融無礙,漸從必然王國走向自由王國。」
逗號,滿懷憧憬:「那是否是一種人劍合一的境界?」
「或許人器合一更準確吧,程序員可不能只會一種兵器喲。」冒號故意摳他的字眼,「如今請你們每人寫一句對本節課的感言。」
衆人沉思片刻,齊齊揮筆而就——
冒號讀罷大悅,順手一掌拍出五記馬屁:「精彩之極!可謂字字珠璣、句句聯璧啊。茲決定,給諸位的獎賞是——立時下課!」
衆人欣然領賞而去。