動態語言靜待花開

 From: http://www.cnblogs.com/dujun0618/archive/2008/02/21/1075900.html

 

   

與主流的C、C++和Java等開發語言相比,諸如PHP、Perl之類的腳本語言和Ruby、Python等語言雖然適應面相對較窄,但以其簡潔、靈活、易於學習和維護的特點在企業應用中逐漸佔據了一席之地。

動態語言解困開發人員

IT日益重要,它已成爲可以帶來競爭優勢的一種核心能力。與此同時,IT部門要完成的軟件開發項目的數量顯著增加。企業的IT管理人員清楚地認識到項目未完成所帶來的隱性成本,迅速拋棄了對動態語言存在的偏見,尋求可以迅速減少積壓項目的一種方法。

說到往諸多企業開發語言裏添加動態語言,僅僅爲了完成項目而倉促生成“快速而粗劣”的代碼仍是一種不明智的方法。這種方法不但會帶來棘手的維護問題,比如《薩班斯-奧克斯利法案》法規遵從方面的限制,更不用說越來越重要的安全應用軟件交付了。很多企業不能承擔權宜之計的編程方法帶來的風險。不過如果IT人員採取慎重的態度,利用動態語言開發適合的項目,那麼就可以利用動態語言的獨特表達力,編寫乾淨、可靠、可重複使用的代碼,從而提高工作效率,同時又不危及企業的完整性。

如果對動態語言進行合理細分,可以分爲: 特定領域語言(DSL)、小語言、腳本語言(如PHP和Perl),以及最上層的通用動態語言(如Ruby和Python)。每種語言可以處理不同範圍的任務,爲開發人員提供先進程度不同的工具。如果使用得當,每種語言都能帶來工作效率的提升,而這正是不堪重負的開發人員所尋求的。

特定領域語言

DSL廣泛應用於整個企業,它被認爲是動態語言革命的歷史基礎,而不是這場革命的一部分。DSL比真實語言更類似一連串命令或者數據項。Make(用於編譯及鏈接C和C++程序的一個實用程序)就是一種DSL;Ant也是如此,它可以爲Java執行類似功能。Ant“命令”被編碼成必須遵守一定格式和順序的XML語言,構成了DSL的語言集。這些工具很少擁有擴展的邏輯功能,譬如複雜的程序流或者決策功能。

小語言

比DSL高一級的動態語言就是小語言,它的特點是語法的表達力很強並能在特定領域裏面傳達複雜邏輯。小語言往往使用有限的詞彙。Unix衍生出了許多小語言。最典型的一個例子,awk被設計人員描述成“用於編寫小程序來執行常見數據處理任務的一種模式匹配語言”。譬如說,爲了把表格數據從文本文件轉換成Excel能夠讀取的CSV數據,只需要三四行awk語句。至於複雜的數據處理,awk可能要用100行代碼,不過代碼行超過這個數的awk程序非常少。

Unix的功能很強,這主要歸功於衆多實用程序和小語言讓使用者能夠通過外殼腳本對操作進行排序——外殼腳本本身是一種DSL或者小語言,具體取決於用戶使用哪種外殼語言。小語言的問題在於,每種語言本身都自成一體。正因爲如此,高級的Unix用戶必須學習sed、awk、pic和外殼編程等方面的語法,這樣才能充分發揮它們共同的潛力。因此,Unix用戶一直在日益求助於比較通用化的腳本語言,這些語言涵蓋了每種小語言提供的各項功能。

不過,小語言在商業市場領域仍過得有滋有味,獨立軟件開發商(ISV)使用這些專有方法,爲編程人員提供了使用、改動或者擴展其產品的一種方法。最有名的例子就是PostScript,這是Adobe公司設計及維護的頁面定義語言。多年來,PostScript的適用範圍和複雜性都得到了擴展,現在類似一種真正的編程語言,但還是擺脫不了大多數命令側重於頁面佈局的侷限。

消除這個術語和微軟所用術語之間的歧義也很重要:2004年,微軟公司宣佈了開發人員可用來自行編寫DSL的一些工具。原本有極大吸引力的一種語言結果卻成了毫不相干的東西。正如分析師Larry O'Brien所言:“微軟的DSL與編寫語言幾乎沒有多少關係。微軟借用了DSL這個術語指代這樣的開發工具:讓程序員能夠以可視化方式圖解工作流、表達業務領域邏輯,然後可以利用這些圖生成代碼。這個解決辦法儘管有效,但不是大多數人提到DSL時所指的那個意思。”他負責維護的知名Knowing.Net博客專門分析微軟的開發技術。

腳本語言

在諸多動態語言中,基於腳本的動態語言最爲一般人熟悉。說到IT人員利用動態開發技術獲得好處,腳本語言正是這種模式開始真正獲得回報的方面。這種高級語言在企業中通常用於執行兩種功能當中的其中一種: 充當應用各部分之間的粘合劑,或者爲低級語言提供很高的抽象級別。

Perl就是一個例子,這種粘合語言用於組合較大應用的各組件。JavaScript是另一種粘合語言,負責協調瀏覽器裏面的各項活動。雖然JavaScript最初用於帶來瀏覽器會話,但現在它帶來了一種更豐富的瀏覽器交互,這主要是由於AJAX越來越流行。

第二種腳本語言在缺少表達性高級手段的環境下提供了高級編程構件。譬如說,最近發佈的Groovy語言爲Java引入了衆多的高級構件,大大減少了Java創建及管理對象需要編寫的代碼數量。它還簡化了數據結構的描述,並提供了處理XML數據的簡單、直觀的方法。Lua就是另一種此類語言,它非常適合於使用C編寫的程序。Lua最近重新流行起來,擴大到了學術界以外的領域,這要歸功於遊戲開發人員,他們需要低級C代碼的速度,也渴望得到Lua提供的較高級構件。

PHP是在企業中日漸得到接受的另一種腳本語言。PHP一般嵌入在網頁中顯示動態內容,它讓種類非常廣泛的應用可以在Web服務器上運行。實際上,如今的許多Web應用都使用PHP編寫,因爲它與Java相比是簡易語言,而且便於學習及部署。不過,比較直觀的語法讓人覺得PHP程序是一種快速但粗劣的編程語言,這兩個優缺點同樣明顯。不過,PHP在企業中的地位在迅速上升。

Python和Ruby

在爲企業的動態語言潮流起到推波助瀾的所有工具當中,Python和Ruby等通用動態語言爲提高開發人員的工作效率帶來了最大好處。這些開放源代碼語言與特定領域並不聯繫在一起,提供的編程機制消除了標準應用編程方法速度緩慢或者單調乏味的缺點。它們易於學習及使用,還讓開發人員能夠不必生成大量的多餘代碼就可以編寫大型應用。

Ruby和Python存在已有一段時間了,兩者都是在上世紀90年代設計而成的。據跟蹤分析語言使用的Tiobe.com網絡聲稱,Python幾乎是一炮打響,而Ruby直到最近才躋身於前十大語言。Ruby最近知名度上升主要歸功於RoR(Ruby on Rails),這種Web框架讓開發人員能夠迅速把數據驅動的網站組合起來。

Ruby仍是企業開發領域的新語言。雖然IT人員部署Python有着悠久歷史,可是Ruby在企業裏會得到多少廣泛的部署並不清楚,特別是在旗艦性的RoR框架外面。值得一提的是,Python和Ruby都擁有龐大、活躍、忠誠的開發社區,它們在不斷編寫新的庫模塊,同時支持有時還在推動最初的語言設計人員添加功能。隨着這些語言本身不斷得到完善,它們無疑會帶來更高的工作效率。

企業當中的動態語言

說到動態語言在企業中找到一席之地,可擴展性提供了靈驗的試金石,因爲腳本語言不太適合需要高度可擴展性的項目,而是非常適合標準的業務數據處理(譬如批處理和報表生成)、中小型項目以及中低型流量負載的Web應用。狂熱的愛好者勢必會提到動態語言用於比較大的項目,但這種情況往往是例外,而不是慣例。

在IT部門面臨的所有開發任務當中,Web應用是使用動態語言特別有效的領域。而首當其衝的幾種動態語言是Ruby、Python和Groovy。

RoR即Ruby的殺手級應用是一種“固執已見”的語言,因爲它對如何設計Web應用有着獨特視角。RoR的主要設計師David Heinemeier Hansson將這種方法稱爲“約定優於配置”(convention over configuration),它可以讓用戶很快就能運作起來,只要其設計適合所選擇的模式。RoR設計很少針對特定語言。而基於Groovy的Grails爲Java虛擬機(JVM)提供了一種類似設計。

考慮Rails的管理人員應當注意:Hansson直言不諱地指出了RoR不是爲企業應用而設計的。這類項目是遠非RoR模式所能實現的,也不容易經過改動後就適合RoR。但要是沒有把RoR推到它適用的小衆領域之外,而是使用它處理其所擅長的任務,就能迅速完成開發項目,從而獲得真正的回報。

Python利用了名爲Zope的應用服務器,這種服務器的設計比Hansson的設計更接近傳統Web框架的設計。Zope的人氣曾經一度與現在的RoR一樣旺,也是因爲它可以完成以前只有低級語言才能完成的任務。


在微軟IIS裏設置支持動態語言

Python的主要優點在於,它可以運行在比Ruby更多的運行時環境上。現在有些版本可以運行在JVM上(Jython)、有些可以運行在微軟.Net平臺上(IronPython),後者得到了微軟的支持。Python的另一個優點在於,它的客戶羣比較龐大,還有數量衆多的開發人員,長期以來他們已積累了這種語言方面的豐富編程經驗。

Groovy在三者當中的客戶羣最小,這是由於它的歷史比較短。不過,它具有Ruby和Python所沒有的一個獨特優點:Java開發人員熟悉它的語法。該語言旨在爲Java提供較高級語法,並且引入動態元素,那樣Java開發人員就能提高工作效率,不像Java那樣累贅多餘。Groovy的另一個優點是,它作爲單一的Java歸檔(JAR)文件來部署,那樣它就可以輕鬆集成到比較大的Java應用裏面。這樣一來,開發人員就可以利用現有的Jave代碼,同時獲得動態語言的好處。

加快完成項目

正如Tiobe.com所示,動態語言的採用具有一種明顯的模式: 新語言先是突然流行起來(譬如目前Ruby就是這樣),之後進入持續穩步發展狀態,使用率和採用率都穩定下來。不過值得一提的是,隨着IT管理人員迅速認識到使用動態語言可以比企業的低級主流語言更快地編寫有價值、易於維護的代碼,PHP、Perl、Python和Ruby等動態語言正在企業裏發揮更大的作用。

動態語言解決不了IT部門如今面臨的項目過剩的所有問題。不過,合理分配動態語言來開發項目有助於迅速減少有待完成的IT任務,從而使企業能夠獲得迅速利用新出現的機會所必要的敏捷性。

鏈接一:動態語言與靜態語言

動態語言(或稱動態編程語言,Dynamic Programming Language)是指程序在運行時可以改變其結構的語言,比如新的函數可以被引進,已有的函數可以被刪除等結構方面發生的變化。衆所周知的ECMAScript(JavaScript)便是一種動態語言。除此之外如Ruby、Python等也都屬於動態語言,而C、C++等語言則不屬於動態語言。

從概念上說,動態語言就是類型檢查在運行時完成,而靜態語言的類型判斷是在運行前判斷(如編譯階段),比如C#就是一種靜態類型語言,靜態類型語言爲了達到多態會採取一些類型鑑別手段,如繼承、接口,而動態類型語言卻不需要。

靜態類型語言的主要優點在於其結構非常規範,便於調試,方便類型安全;缺點是爲此需要寫更多的類型相關代碼,導致不便於閱讀。動態類型語言的優點在於方便閱讀,不需要寫非常多的類型相關的代碼;缺點是不方便調試,命名不規範時會造成難於理解等問題。

現在有這樣一種趨勢,那就是合併動態類型與靜態類型於一種語言中,這樣可以結合動態語言和靜態語言雙方的優點。

Boo 是一種在.NET環境下與Python有相似語法的一種靜態語言。Boo一方面可以獲取動態語言,例如類似Python這樣的語言語法方面的優勢,可以內建一些數據結構;另一方面,其又是有類型的靜態語言,具有速度等方面的優勢。

鏈接二:動態語言的缺點

雖然動態語言提供了毋容置疑的編程優點,但它確實也有侷限性。對於往諸多企業開發語言裏添加動態語言的管理人員在使用相應技術開發特定的軟件項目時,必須牢記以下這些缺點:

● 可擴展性:Python和Ruby都使用各自的虛擬機,但它們都不適合線程——實際上,它們對線程提供的支持很少。所以,需要許多並行線程的應用不適合使用Python或者Ruby來開發。另外,多核和多個處理器等硬件資源不會得到有效利用,因爲這些虛擬機無法有效地利用這些硬件。因此,許多Ruby愛好者求助於JRuby,Sun支持的這個開源項目可以讓Ruby在Java虛擬機上運行,從而對線程提供了出色的支持。JRuby用於內部開發的項目和試點項目還爲時過早。

● 性能: 沒有哪一種主要的動態語言使用像Java虛擬機那樣得到全面優化的虛擬機。因而,這些語言的運行速度要比Java慢得多。其他因素如語言特性也影響了性能。Linux社區經常更新的語言基準測評顯示,在衆多測試當中,Java的運行速度是編譯後C的1.8倍、Lua(使用即時編譯器)的3倍、Python的6.7倍、PHP的7倍、Perl的9.8倍、Ruby的16倍。所以,要是性能至關重要,Java或者編譯語言的速度比任何動態語言(使用即時編譯器的Lua除外)快得多。

● 開發工具: 如果開發人員習慣了使用Visual Studio .Net或者幾種主要的Java集成開發環境(IDE)具有的特性集,他們會驚訝地發現動態語言缺少相應環境。如今,面向Perl、Python和Ruby的最佳IDE是ActiveState公司新發布的Kimodo IDE 4.0。Kimodo的主要競爭者是單一語言工具。現在大多數這些語言還缺少有真實價值的開源工具,因爲沒有與Eclipse或者NetBeans相當的那個環境,不過這兩種環境擁有支持各種動態語言的插件。

● 開發社區:雖然像Perl、Python和Ruby這些主要的動態語言都有活躍、發展興旺的社區,但沒有哪個可與C、C++和Java等主流語言的開發社區相提並論。這方面只有PHP最接近。這些社區規模比較小,這意味着在僱用具有特定語言技能的人員時,可利用的開發人員數量要少得多。幸好,動態語言一般比較容易學習。因此,公司可以很快對內部員工進行交叉培訓。雖然新近培訓的員工不會一夜之間成爲專家,但他們可以立即編寫代碼,這歸功於這些語言天生具有的高效優點。

發佈了2 篇原創文章 · 獲贊 0 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章