<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    冒號課堂§6.4:后臺腳本

     

    冒號課堂

    6.4后臺腳本——敏捷開發(fā)的利器

    操千曲而后曉聲,觀千劍而后識器                          ——《文心雕龍·知音》

     

    關(guān)鍵詞:后臺腳本, Perl,PHP,Python,Ruby,RoR,LAMP

    摘要:簡談PerlPHPPythonRuby

     

       預(yù)覽

     

    ·          語言的發(fā)展趨勢一定是動靜結(jié)合、剛?cè)岵?/span>

    ·          Perl凝練晦澀,Python優(yōu)雅明晰,Ruby精巧靈動,PHP簡明單純

    ·          或許優(yōu)雅正是來自對細節(jié)和規(guī)范的重視

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

       
    提問
     


    • PerlPythonRubyPHP各自有何特點?
    • 為什么動態(tài)語言多作為輕量級的解決方案?
    • LAMP為什么受歡迎?
    • Ruby on Rails為什么會流行?
    • 編程語言的發(fā)展趨勢是什么?

     

         講解

     

    “剩下四種動態(tài)語言,我們將之歸為后臺腳本語言。”冒號說著畫了張圖表——

    用戶

    前臺語言Visual BasicDelphiJavaScript

    平臺語言JavaC#

    后臺腳本語言PerlPHPPythonRuby

    系統(tǒng)語言CC++D

    機器

    引號聽得仔細:“我記得您開始是把這些語言劃分為C族靜態(tài)語言、非C族靜態(tài)語言和動態(tài)語言三類的。”

    冒號解釋:“那是按語法來劃分的,偏重理論;現(xiàn)在是按應(yīng)用來劃分,偏重實踐。”

    句號旋即聯(lián)想到:“這種分法貌似三層架構(gòu)——前臺語言對應(yīng)表現(xiàn)層;平臺語言和后臺腳本語言對應(yīng)業(yè)務(wù)邏輯層;系統(tǒng)語言對應(yīng)數(shù)據(jù)層。”

    “的確有些神似,但千萬不可混淆。”冒號提醒道,“三層架構(gòu)(three-layer architecture)是模塊設(shè)計上的邏輯劃分[1];而這里是按語言應(yīng)用范圍進行的物理劃分——與用戶交互的是前臺語言,與機器交互的是系統(tǒng)語言,介于其中的為前臺提供服務(wù)同時又需要底層系統(tǒng)服務(wù)的是后臺語言。”

    逗號詢問:“后臺語言又細分成平臺語言與后臺腳本語言?”

    “這是基于程序(program)與腳本(script)、靜態(tài)與動態(tài)而分的。”冒號進行說明,“其實PerlPHPPythonRuby都有自己的虛擬機(virtual machine),從這種意義上說它們也可作為平臺語言。但在實際應(yīng)用中,它們沒有Java平臺和.NET平臺那種整合凝聚力和核心作用,通常作為輕量級的解決方案。”

    問號想探個究竟:“這是由于它們都是動態(tài)語言的緣故嗎?”

    冒號回答:“理論上動態(tài)語言同樣能承擔(dān)大型應(yīng)用,但實踐上它們多作為粘合語言或用于中小型應(yīng)用。用句時髦的話來形容,暫時還是主流的配角非主流的主角。畢竟在運行效率、類型安全、可用資源、開發(fā)工具、技術(shù)支持等方面,它們與JavaC#相比尚有一定差距。另外它們同屬‘草根’語言,雖有開源社區(qū)的大力支持,在影響力上與后者未可同日而語。”

    嘆號揣測:“說不定在不久的將來,動態(tài)語言也會成為主流的主角。”

    “世易時移,殊難逆料。但有一點可以肯定,語言的發(fā)展趨勢一定是動靜結(jié)合、剛?cè)岵?#8221;冒號斷言,“一方面以JavaC#為代表的靜態(tài)語言中嫁接了動態(tài)語言的枝條;另一方面以Java.NET為代表的平臺與動態(tài)語言的交壤地帶也在逐步擴大。比如JRuby允許RubyJava之間互相調(diào)用,類似的還有JythonIronRubyIronPython等等。此外值得一提的是,動態(tài)語言最活躍的舞臺當(dāng)數(shù)LAMPL-A-M-P。”

    引號接茬:“LLinuxAApacheMMySQLPPHP。這四大組件形成了一個完整的開源網(wǎng)絡(luò)開發(fā)平臺。”

    冒號補充道:“P也可指PerlPython,甚至Ruby。”

    逗號調(diào)侃:“可惜Ruby的‘R’比‘P’多了一根尾巴。”

    “有人為了自圓其說,干脆讓P表示‘Programming language’,這下所有語言都囊括其中了。老外就喜歡玩這種首字母縮略(acronym)的文字游戲,尤其LAMP正好還有‘燈’的含義,寓意開源世界的一盞明燈,他們一定更得意了。”冒號語帶調(diào)笑,“前面我們曾提及,網(wǎng)絡(luò)應(yīng)用是生長動態(tài)語言最肥沃的土壤,而LAMP就是這塊土壤上搭建的平臺。作為網(wǎng)絡(luò)平臺,LAMP以其開放靈活、開發(fā)迅速、部署方便、高可配置、安全可靠、成本低廉等特色而與Java平臺和.NET平臺鼎足三分,尤其受中小企業(yè)的歡迎。LAMPLinux是操作系統(tǒng),ApacheWeb服務(wù)器,MySQL是數(shù)據(jù)庫系統(tǒng),而我們當(dāng)下最關(guān)心的是‘P族語言’:PHPPerlPython還有Ruby。”

    問號建議:“作為動態(tài)語言,它們的共性上節(jié)課已經(jīng)談了不少,能說說它們的個性嗎?”

    “它們的個性極為鮮明:Perl凝練晦澀,Python優(yōu)雅明晰,Ruby精巧靈動,PHP簡明單純。先看老大哥Perl,它博采眾家之長,綜合了C語言的結(jié)構(gòu)、sed的正則表達式、AWK的關(guān)聯(lián)數(shù)組(associative array)、Lisp的表(list)和Unix Shell的命令,此外還有借鑒了一種語言,你們知道是哪種嗎?”冒號忽然賣了個關(guān)子。

    逗號猜想:“應(yīng)該是某種OOP語言吧。”

    Perl中確有不少C++的影子,但它的對象模型在5.0以后才引入,典型的半路出家,遠不如前面的特征那么自然。與其說是一種自然而然的發(fā)展,不如說是在OOP潮流裹挾下的一種身不由己的迎合。真正深入骨髓的借鑒是自然語言。”冒號給出了答案,“我們提過,Perl的發(fā)明者Larry Wall是一名語言學(xué)家,他認為程序語言應(yīng)該與自然語言一樣,簡潔自然、易讀易寫、表達多樣、不拘一格。Perl還有不少的格言或哲學(xué),使得編程語言一改嚴謹刻板的面孔,散發(fā)出濃郁的人文氣息。”

    嘆號幽了一默:“我見過Perl的代碼,人文氣息沒聞出來,但我懷疑有乙醚氣息——看一會就覺得暈暈乎乎的。”

    眾人大笑。

    “有人僅用一行Perl代碼就實現(xiàn)了RSA算法,你看了那還不得當(dāng)場暈倒啊?”冒號打趣道,“Perl的各種魔符好似一把把鋒利的剪刀,做起文本裁剪之類的工作來游刃有余。這是它最大的長處,當(dāng)初Perl就是Wall用來做Unix系統(tǒng)管理的,以后在CGI上的廣泛應(yīng)用也得益于此。這也賦予Perl極強的粘合力,因而有‘internet上的膠帶(duct tape[2]’的說法。它又號稱瑞士軍刀,精練而復(fù)雜,實用而強大。但Perl過于靈活自由,缺乏規(guī)范,影響了程序的可讀性、一致性、整潔性和可維護性。不熟悉該語言的固然如讀天書,熟悉語言而不熟悉問題的也頗費思量。相比之下Python被認為是Perl有力的挑戰(zhàn)者,不僅在于它天然的OO設(shè)計和豐富的類庫,更重要的是它對程序員友好度大大超過PerlPython也有一系列的被稱為禪(Zen)的哲學(xué),不少與Perl是針鋒相對的。比如:Perl認為做一件事可以有多種方法,而Python認為一件事應(yīng)該最好只有一種方法;Perl追求語言的表現(xiàn)力,Python追求簡單優(yōu)雅;Perl喜歡隱性暗示,Python強調(diào)顯性明示;Perl強調(diào)緊湊,Python強調(diào)松散; Perl的語法和語義豐富,Python的語法和語義簡單而類庫豐富。或許Python最讓人不習(xí)慣的是它對空白符敏感性。”

    引號感到驚奇:“對空白符敏感?這個倒真怪異。”

    冒號見慣不怪:“雖然有點違反習(xí)慣,但非常符合Python一貫的規(guī)范簡潔的風(fēng)格——一方面從語法上保證了良好的編碼風(fēng)格;另一方面,每個代碼塊不再需要起始的大括號或begin/end之類的,減少了的代碼行數(shù)。順便插一句,另外一種優(yōu)雅的語言Haskell同樣對空白符敏感,或許優(yōu)雅正是來自對細節(jié)和規(guī)范的重視吧。此外許多人抱怨Python中的自引用self太多,殊不知這也是它倡導(dǎo)顯式表達的一種體現(xiàn)。總的看來,Python主要的問題還是在性能效率上不盡如人意。”

    嘆號好奇地問:“Ruby怎么樣?據(jù)說它將取代Java。”

    “不要輕言‘取代’二字。”冒號規(guī)誡道,“Java沒有取代C++,也不會被Ruby取代,至多只是一種再分配。不過Ruby的確是門很可愛的語言,兼具Perl的表現(xiàn)力和Python的可讀性。Ruby背后最具特色的理念是:關(guān)注程序員使用語言時的感受超過語言本身的功能。通俗地說,兵器的稱手比鋒利更重要;文雅地說,應(yīng)給予程序員更多的人文關(guān)懷。就拿代碼塊(block)和迭代器(iterator)來說,雖然均非Ruby首創(chuàng),但其語法最為賞心悅目。類似的例子比比皆是。Ruby的元編程能力特別強,也是它高度靈活的一種體現(xiàn),但并不是所有人都喜歡這種風(fēng)格。Ruby的主要弱點有兩個:一個與Python類似,在性能上還有待提高;另一個是它的線程由用戶空間user space)而不是內(nèi)核空間kernel space)來管理[3],不能充分利用多核或多CPU。真正讓Ruby變得炙手可熱的是web應(yīng)用框架 Ruby on RailsRoR)的成功,它們還催生了Java平臺上的Groovy語言和Groovy on Grails框架。RoR奉行的CoCConvention over Configuration)和DRYDon't repeat yourself )原則以及MVC架構(gòu)看似了無新意,但與Ruby結(jié)合之后,便如一只猱身而上靈貓,立刻襯托出Java.NET大象般的身影。”

    逗號有些懷疑:“框架竟然捧紅了語言,框架真有這么重要嗎?”

    “如果web應(yīng)用中動態(tài)頁面較少或業(yè)務(wù)邏輯不復(fù)雜,框架的價值并不大。以前CGI編程就是往Perl之類的代碼中嵌入HTML代碼,如同Java中的ServletPHP則單純地在HTML代碼中插入PHP代碼,如同早期的JSP。沒有MVC,也不管什么三層架構(gòu),更沒有ORM。但是——”冒號拖了個轉(zhuǎn)折音,“一旦業(yè)務(wù)邏輯變得復(fù)雜,開發(fā)人員增多,手工作坊式編程開始捉襟見肘,引入框架這個流水生產(chǎn)線來提高生產(chǎn)力便是大勢所趨。”

    句號不解:“我想PerlPythonPHP一定也有不少框架,Java中的框架更是泛濫成災(zāi),何以獨獨RoR脫穎而出?”

    冒號作出分析:“正值web2.0和敏捷開發(fā)(agile development)的概念流行之際,RoRAJAXRuby組合在一起成為絕佳的回應(yīng)。以前各種web應(yīng)用框架是不少,但在RoR之前輕量級套餐式解決方案并不多。Perl中的CatalystPython中的Pylon還有PHP中的CakePHP等應(yīng)是效仿之作。因此RoR出現(xiàn)的時機可說是不早不晚,正當(dāng)其時。此外,PerlPHP由于過于流行,反而有不少的歷史包袱,人們習(xí)慣了將表示邏輯和業(yè)務(wù)邏輯編織在一起。至于Java企業(yè)解決方案,框架太多,搭配組合更多,增加了選擇的難度。即使采用最常見的輕量級SSHStruts+Spring+Hibernate)組合,維護起來也比RoR繁雜得多。”

    嘆號愈發(fā)擔(dān)憂:“聽這意思,Java還是危險啊!”

    “言之過早。”冒號不以為然,“首先RoR還有待進一步檢驗,目前無論是應(yīng)用廣度還是深度上尚無法與Java相提并論;其次Java在性能、安全等方面還是有不少優(yōu)勢,而這些對于大型和關(guān)鍵性的應(yīng)用來說尤為重要。即使在中小型web應(yīng)用中,RoR較之PHP還遠為不及。”

    問號接下話題:“PHP為何如此流行?”

    “因為它簡單、專一。”冒號答得很干脆,“與PythonRuby一開始就定位通用語言不同,PHP是專為網(wǎng)絡(luò)而生的。同早期的Perl相似,PHP起初主要起文本過濾器的作用,只不過Perl多處理文件流(file stream),而PHP多處理套接字流(socket stream)。PHP的語法簡單,且為網(wǎng)絡(luò)應(yīng)用度身定造,受到網(wǎng)絡(luò)開發(fā)人員的追捧當(dāng)在情理之中。它雖很實用很流行,但并不完美。比如:變量名大小寫敏感而函數(shù)名大小寫不敏感;函數(shù)命名規(guī)則不一致;不支持namespaceunicode[4];與Perl一樣,它的對象模型不是先天的,直到PHP 5才真正完善;對線程支持不足;相比PerlPythonRuby,它的功能稍顯單薄等等。”

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

    “不僅PHPPerlPython還有Ruby,都能作為前臺語言來開發(fā)命令行或圖形界面的應(yīng)用。同樣地,VBDelphiJavaScript也能作為后臺語言。現(xiàn)代的程序語言既有自己的專長,又向通用化和全能化發(fā)展,以爭取更多的生存空間。試想一下,現(xiàn)代的程序員又何嘗不是如此呢?”言及于此,冒號收住話題,“語言簡評告一段落,還有不少既有趣又有用的語言,在此就不一一評說了。我們看到,每種編程語言都有其獨特的慣例用法和哲學(xué)理念,它們與編程范式一道形成了語言的編程風(fēng)格。體悟愈深者編程語感愈強,思維與語言愈交融無礙,漸從必然王國走向自由王國。”

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

    “或許人器合一更準確吧,程序員可不能只會一種兵器喲。”冒號故意摳他的字眼,“現(xiàn)在請大家每人寫一句對本節(jié)課的感言。”

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

    嘆號——沒有最好的語言,只有最合適的語言。

    逗號——沒有糟糕的語言,只有糟糕的程序員。

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

    引號——廢除對語言的宗教信仰,建立對語言的哲學(xué)思維。

    句號——編程就是在人腦和電腦之間尋找最佳平衡點的過程。

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

    眾人欣然領(lǐng)賞而去。


       插語

    [1] 有兩種三層架構(gòu),一種是three-layer architecture,一種是three-tier architecture。它們經(jīng)常換用,但其實是有分別的:前者僅僅在邏輯進行劃分,而后者在物理上也進行了劃分——不同層次的模塊運行在不同的主機上。

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

    [3] 這類線程被稱為綠色線程(green thread),也稱偽線程。據(jù)稱Ruby2.0將支持原生線程(native thread)。

    [4] PHP將在5.3.0支持namespace,將在6.0支持unicode

     

       總結(jié)

    • 比起Java平臺和.NET平臺,動態(tài)語言輕便靈活、開發(fā)效率高,但整合凝聚力還不夠,在運行效率、類型安全、可用資源、開發(fā)工具、技術(shù)支持以及影響力等方面也有一定差距,故通常作為輕量級的解決方案。
    • LAMP是由LinuxApacheMySQL和包括PHPPerlPythonRuby在內(nèi)的腳本語言組成的網(wǎng)絡(luò)開發(fā)平臺,具有開放靈活、開發(fā)迅速、部署方便、高可配置、安全可靠、成本低廉等優(yōu)點。
    • Perl精練、復(fù)雜、強大、靈活、自由、隱晦、表現(xiàn)力強,但規(guī)范性、可讀性、一致性、整潔性和可維護性較差。
    • Python優(yōu)雅規(guī)范、簡潔明晰、易學(xué)易用、類庫豐富,但效率稍差,有些人不喜歡它對空白符敏感的特性。
    • Ruby語法精巧、高度靈活,兼具Perl的表現(xiàn)力和Python的可讀性,尤其注重程序員的感受,但其性能和線程模型尚有待改進。
    • PHP簡單、專一、實用、流行,在但相比其他三種語言,在語法和功能上稍有欠缺。
    • RoR是一種輕量級套餐式的web應(yīng)用解決方案,是由好的設(shè)計(MVC架構(gòu)和CoCDRY原則)加上好的語言(Ruby)在好的時機(web2.0和敏捷開發(fā)風(fēng)行之際)打造出的好的框架。
    • 靜態(tài)語言與動態(tài)語言從語言特征到運行環(huán)境都在逐漸融合。
    • 程序員應(yīng)該與程序語言一樣,既要有自己的專長,又要向通用化和全能化發(fā)展。
    • 編程語言慣例用法、哲學(xué)理念和編程范式形成了語言的編程風(fēng)格。

     

      “”參考

    [1] Larry Wall, Tom Christiansen, Jon OrwantProgramming Perl, 3rd ed.Sebastopol, CAO'Reilly2000

    [2] Mark Lutz, David AscherLearning Python, 2nd ed.Sebastopol, CAO'Reilly2003

    [3] Michael FitzgeraldLearning RubySebastopol, CAO'Reilly2007

    [4] Michele E. Davis, Jon A. PhillipsLearning PHP & MySQL, 2nd ed.Sebastopol, CAO'Reilly2007



    課后思考

    • 有人認為掌握的語言過多,容易互相混淆,不如精學(xué)一門。你認為呢?
    • 在實際編程中,你有選擇編程語言的權(quán)力嗎?如果有,選擇的原則是什么?
    • 在前臺編程、后臺編程和系統(tǒng)編程中,你主要專注于哪方面?你認為它們之間的主要差別在哪里?
    • 你所熟悉的編程語言有哪些慣例用法和哲學(xué)理念?
    • 試著學(xué)習(xí)一門新的語言,最好與目前掌握的知識集合互補。

    posted on 2009-03-02 10:05 鄭暉 閱讀(3777) 評論(4)  編輯  收藏 所屬分類: 冒號課堂

    評論

    # re: 冒號課堂§6.4:后臺腳本 2009-03-02 12:31 鄭暉

    @zhujianf
    編程需要的是智慧,不是小聰明。你的”黃色幽默“顯然用錯了地方,也貼錯了地方。刪貼是我唯一的選擇,抱歉。  回復(fù)  更多評論   

    # re: 冒號課堂§6.4:后臺腳本 2009-03-03 10:17 阿桂

    做為程序員,只懂個if else,這就是中國軟件落后的原因。。。  回復(fù)  更多評論   

    # re: 冒號課堂§6.4:后臺腳本 2009-03-03 12:47 SQnote

    re
      回復(fù)  更多評論   

    # re: 冒號課堂§6.4:后臺腳本 2009-10-24 19:25 xscc

    寫的不錯,見識挺廣的  回復(fù)  更多評論   

    導(dǎo)航

    統(tǒng)計

    公告

    博客搬家:http://blog.zhenghui.org
    《冒號課堂》一書于2009年10月上市,詳情請見
    冒號課堂

    留言簿(17)

    隨筆分類(61)

    隨筆檔案(61)

    文章分類(1)

    文章檔案(1)

    最新隨筆

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 成在线人直播免费视频| 国产亚洲午夜高清国产拍精品| 亚洲av成人综合网| 又粗又大又黑又长的免费视频| 亚洲天堂电影在线观看| 国产高清不卡免费在线| 亚洲午夜久久久精品电影院| 四虎免费影院ww4164h| 亚洲成A∨人片在线观看无码| 亚洲视频免费一区| 91嫩草亚洲精品| 成人免费一级毛片在线播放视频| 亚洲天堂2016| 免费激情视频网站| 国产亚洲综合视频| 亚洲日本一区二区三区在线不卡| 国外亚洲成AV人片在线观看| 乱淫片免费影院观看| 亚洲区小说区图片区| 中文字幕免费在线播放| 国产成A人亚洲精V品无码| 久久国产精品免费视频| 久久久久亚洲AV无码专区首JN| 国产精品成人免费福利| 中文字幕在线日亚洲9| 韩国欧洲一级毛片免费| 国产AV无码专区亚洲AV蜜芽| 亚洲国产91精品无码专区| 中文字幕在线免费看| 亚洲福利视频导航| 国产卡一卡二卡三免费入口| 亚洲成a人无码亚洲成av无码| 免费A级毛片无码A∨男男| 国产免费久久久久久无码| 亚洲AV无码不卡无码| 四虎在线视频免费观看视频| 亚洲欧美日韩国产精品一区| 亚洲AV无码不卡在线观看下载| 国产一级a毛一级a看免费视频| 亚洲国产天堂在线观看| 无码国产精品久久一区免费|