谷歌的Dart語言能否解決JavaScript的速度與規模難題?
譯文大型JavaScript Web應用程序很可能既難于開發、又運行緩慢。相比之下,谷歌的Dart語言針對這兩大難題給出了解決方案。
JavaScript如今的主要應用方式與其最初定位可謂風馬牛不相及:當下它正作為托管于瀏覽器當中的平臺用于大型Web應用程序開發。如果創造JavaScript的技術人員能夠早點預見到這類應用方式——而不僅僅是為Web頁面增添活力——那么JavaScript的設計思路很可能完全不同。
這是因為在大型Web應用程序的開發流程中,存在著兩大主要難題。
首先,性能難題:作為無法辯駁的事實,利用JavaScript編寫的大型應用程序在運行速度方面相對較慢,這必然會給程序用戶造成負面影響。
其次,JavaScript本身的結構也存在問題:這是一種語言,因為大型團隊很難利用它組織開發工作。不同模塊之間缺乏明顯的結構以及強有力的聯系,加之代碼本身的表達意圖難以付諸溝通,這給開發團隊造成很大困擾。對于個人開發者,溝通便捷性似乎并不重要;但對于大型項目的開發團隊而言,溝通編碼意圖是保證項目成功的關鍵所在——尤其是隨著時間推移產生的人員更替,繼任者很可能對遺留代碼感到困惑與迷茫。
大型應用程序通常采用模塊化開發機制,即由不同開發人員負責各自獨立的代碼片段。然而由于JavaScript的動態特性,對象行為會隨著時間推移發生變化,這與C、C++、Java或者C#完全不同,意味著大家需要通過執行代碼來確定其具體作用。
對Web應用運行速度的渴求
經過長時間的調整,JavaScript當然已經擁有了一些令人振奮的速度提升效果,而且五年之后橫空出世的谷歌V8 JavaScript引擎為這款根基孱弱的語言帶來巨大飛躍。但必須承認,JavaScript開發人員仍然受到目前這一代JavaScript引擎的嚴重束縛,我們恐怕還要等上很久才能迎來下一輪革命性進化。
可能的方案之一在于asm.js,這是一套采用高度限制機制的JavaScript子集,最顯著的特征在于舍棄了動態特性——也就是JavaScript優化道路上的最大障礙。
顧名思義,asm.js通常被視為一種針對JavaScript引擎的匯編語言。它目前尚處于測試階段,而且由Mozilla負責項目推進。
由于它屬于JavaScript的子集,因此擁有全面向下兼容現有JavaScript引擎的能力。另外,能夠與asm.js協作的引擎在運行速度上也遠高于普通JavaScript——其具體速度能夠達到本地代碼的一半左右。(最新版本的火狐瀏覽器[22版本]能夠支持asm.js優化,Mozilla公司的開發人員網站上也給出了技術演示材料。)
正如C++或者C#開發人員在處理對性能要求較高的代碼片段時常常選擇低級語言,asm.js也可以成為JavaScript開發人員的備選方案——大部分是游戲開發者——并成為創建關鍵性能代碼片段的理想途徑。沒錯,不太可能會有開發人員愿意用它開發整個應用程序,但它確實能讓代碼中的某些子集擁有理想的運行速度。
事實上,大多數開發人員可能從來不會直接使用asm.js。他們更可能使用C或者C++(或者利用現有C或C++應用程序)而后利用Emscripten轉譯器將代碼編譯為asm.js。
大型Web應用程序開發
雖然有能力帶來速度提升,但在利用JavaScript開發大型Web應用程序方面,asm.js就幫不上什么忙了。相比之下,幫得上忙的要數微軟提供的TypeScript方案。從概念上講,TyperScript與asm.js正好相反:asm.js屬于JavaScript的子集,而TypeScript則屬于超集。
這個超集的作用在于為JavaScript開發流程帶來一定結構,從而通過命令行編譯器利用插件將常規JavaScript、類型檢查以及Visual Studio 2012加以集成。它的局限性在于無法帶來性能提升:TypeScript編譯而成的JavaScript內容與手寫JavaScript內容幾乎相同。
Web應用程序的速度與規模
綜上所述,asm.js帶來更理想的運行速度,而TypeScript則提供適用于大型Web應用程序的JavaScript開發環境。但二者無法同時解決這兩大難題。
而這正是谷歌Dart語言的預定目標。根據谷歌公司內部郵件的說法,Dart希望成為一款“JavaScript的終極替代方案,正如用于Web開發的通用語在開放Web平臺上的角色。”
這個目標可謂雄心勃勃,那么Dart到底是什么?它是一種開源編程語言,在設計之初就考慮到了大型應用程序開發以及高運行性能兩大實際需求。事實上,將Dart稱為一種語言并不貼切,因為Dart本身還捆綁有一款驗證器及其它各種開發工具。由Dart編寫的應用程序能夠運行在Dart虛擬機當中,且運行速度可達到瀏覽器上JavaScript速度的兩倍。目前只有谷歌的開源Chomium定制瀏覽器版本才支持Dart,該瀏覽器名為Dartium,但相信Chrome對其實現全面支持將只是時間問題。
編譯為JavaScript
Dart代碼可以通過dart2js編譯器轉化為JavaScript內容,從而以兼容方式運行在一般瀏覽器當中。盡管由Dart編譯而成的JavaScript代碼在運行速度上無法與本地Dart代碼相提并論,但它仍然比開發人員們人工編寫的JavaScript代碼快得多,軟件開發者兼《Dart在行動》一書作者Chris Buckett解釋道。
“當代碼由Dart轉化為JavaScript時,編譯器所做的類似于搖動樹干以震下枝葉,”Bucket指出。在JavaScript方面,即使只需要其中一項功能、大家也不得不添加一整套庫。但在“搖樹”原則的幫助下,Dart能夠在向JavaScript轉化的過程中只納入必要的單項功能而非完整庫。Dart還會對我們的代碼進行分析并有選擇地進行類型檢查,從而刪除一部分不必存在的內容,Buckett表示。而在人工編寫的JavaScript代碼中,我們將被迫以非常保守的方式處理內容。
殺手級Dart應用
目前除了谷歌公司之外,還沒有哪家瀏覽器供應商愿意直接為Dart提供支持,因此Dart成為另一種Web通用語言的可能機微乎其微。不過Buckett認為,杰出性能與簡易規模化開發兩大優勢——外加Dart工具的現有生態系統——很可能會推動Dart走上普及之路。
“在短期內我們還不太可能在其它瀏覽器中看到Dart虛擬機的出現,但如果Dart能夠拿出幾款殺手級應用程序成品,而且在Chrome當中飛速運行——例如下一個Facebook版本——那么人們很可能希望能在自己的瀏覽器中看到Dart的身影,”Buckett提出假設。“這種態勢在移動瀏覽器領域出現的可能性更高,因為JavaScript正是移動設備電池壽命的主要威脅之一。”
現在JavaScript開發人員還迎來了另一條好消息——從JavaScript到Dart的技能轉化過程非常簡單,不過Dart的編程要求比JavaScript要更嚴格一些。總而言之,任何一位曾經利用Java或者C#等服務器端語言從事過開發工作的技術人員都能夠打理好這些額外限制,因此Dart的未來可謂一片光明。
原文鏈接:http://www.cio.com/article/739042/Can_Google_Dart_Solve_JavaScript_s_Speed_and_Scale_Problems_