競速(四):JavaScript的未來

伯樂線上讀者發表於2013-06-26

伯樂線上注:英文原文:John Dalziel,感謝@AvisBlume 的熱心翻譯。如果其他朋友也有不錯的原創或譯文,可以嘗試推薦給伯樂線上。以下是譯文。

瀏覽器廠商對JavaScript有著野心勃勃的計劃。很多廠商都在進行長期投資旨在打造網頁作業系統。為此他們設定了一個目標:要讓JavaScript跑得和native C一樣快。如果這能成為現實,那麼本地應用和網頁應用之間的差異將變得很模糊。

那麼如何才能讓一種動態語言執行起來可以媲美native C呢?

 

ES.next

下一代JavaScript語言目前正在設計中。第6版ECMAScript,也就是ES.next,預計今年下半年將會完成。JavaScript就源自ECMAScript。

該專案的目標之一是快速編譯。為此一系列的特性正在被討論之中,其中包括型別系統、二進位制資料和型別化陣列。型別化資料可以直接被傳遞給型別化即時編譯,這會讓編譯速度和執行速度變得更快。

瀏覽器對ES.next的支援度還很低,但是你可以用這張ES6相容性列表來關注事態發展,也可以把它當做Google的Traceur專案的預演。該專案是基於JavaScript的下一代編譯器。如果你想現在就是用它,那可以關注下the Six Project。

 

WebGL

瀏覽器中的JavaScript不侷限於DOM操作。現在大多數網頁遊戲(不用外掛的那些)都是直接利用標準的2D Context在HTML5 Canvas上進行渲染。Canvas本質上是可寫的點陣圖。利用JavaScript,可以將其他的點陣圖在Canvas上進行各種操作來建立動畫、遊戲、圖表等等。

最快速的Canvas渲染方法是利用WebGL,這是一組提供硬體加速繪圖的JavaScript API。它可以極大地提高表現能力,因為可以將渲染的計算工作交給GPU,而讓CPU更多地處理應用程式的邏輯部分。

可能出乎你意料,其實在現在的所有桌面瀏覽器上WebGL都已經有某種程度的實現了。它在Chrome和Firefox上都已經準備就緒,但首先得獲得Safari和Opera使用者的授權。Microsoft是最後一個堅持者,但已經在即將推出的IE11的洩露版中發現了WebGL的蹤跡。

但即使有了瀏覽器的支援,依然不能保證所有使用者都能使用WebGL,因為使用者不得不為GPU更新顯示卡驅動。如果那些驅動不存在的話,Google Chrome是唯一一個提供了備用軟體渲染器的瀏覽器。WebGL是一項強大而有前途的技術,但還沒有完全準備好。有些廠商出於安全考慮,桌面瀏覽器上還有段路要走,而移動裝置上的瀏覽器更是遙遙無期。當然那些老古董瀏覽器是完全不會支援WebGL了。

 

作為編譯目標的JavaScript

雖然現在所有網頁應用都依賴JavaScript來實現客戶端邏輯,但並非都是用JavaScript寫出來的。很多是用完全不同的語言寫出來然後轉編譯成JavaScript再執行於瀏覽器上的。譬如CoffeeScript和TypeScript被創造出來是為了使JavaScript開發變得更強健。而譬如Java,C++和C#是將JavaScript當做編譯目標的。

交叉編譯問題很多。大幅縮小的輸出程式碼很難跟蹤,另外如果瀏覽器不支援源對映功能的話,也沒辦法進行除錯。源對映檔案是一種將執行時JavaScript對映回源語言的中間檔案。

多年前微軟工程師Scott Hanselman提出了將JavaScript作為組合語言的想法。他的觀點是現在縮小化的JavaScript應用程式碼已經變得不可讀。這一點讓人無可辯駁,但引發了一系列有意思的辯論。很多人的網頁開發生涯始於點開瀏覽器上的“檢視原始碼”,但是當原始碼變得讓人難以理解的時候,我們是否又要擔心不會再有新人加入網頁開發的行列了?

有個將JavaScript作為編譯目標的例子是Mozilla的Emscripten專案。它將LLVM二進位制程式碼編譯成JavaScript。LLVM(Low Level Virtual Machine)是一種很流行的中間編譯格式,幾乎所有語言都有LLVM編譯器。這能讓你用你喜歡的語言寫程式碼然後將其轉編譯成JavaScript。

該專案剛起步不久,但開發團隊已經發布了一些讓人印象深刻的demo。Epic的開發人員將the Unreal Engine 3移植到了JavaScript和WebGL中,他們利用Clang編譯器將用native C寫的程式碼編譯成了LLVM,然後用Emscripten將LLVM編譯成了asm.js JavaScript。

 

asm.js

asm.js是Emscripten的同行者。從字面上看,它是將JavaScript當成組合語言。該規範利用JavaScript語言極其有限的一個子集來建立組合語言。因此,雖然你可以用手寫出asm.js程式碼,但你不會真想這麼做的。要發揮其最大功效,你會需要兩個編譯器的幫助。

Emscripten編譯器可以生成asm.js。其產生的JavaScript也許不可讀,但卻是有效並且向後相容的,這意味著它能在任意瀏覽器上執行。如果引擎可以識別asm.js格式並且將其程式碼寫入專用的編譯器,那麼帶來的速度提升會是巨大的。為此Mozilla已經在研發OdinMonkey,一款建立在IonMonkey基礎之上的asm.js優化編譯器,而Google也保證將會在Chrome中支援asm.js。

任何遵循該規範的JavaScript將不會需要垃圾回收、裝箱值或者動態型別。早期的測試表明表現能力可以達到C++一半的水平,甚至可以與Java或者C#相媲美。開發團隊相信還能進一步提升。

Mozilla的研發正熱火朝天地進行中。除了Emscripten和asm.js之外,他們還在進行LLJS(JavaScript as C)專案,另外還與Intel共同開展River Trail專案。該專案是ECMAScript在多核並行處理上的擴充套件。這些讓人振奮的訊息讓人覺得JavaScript很可能會趕上native C的速度。

 

最後,是ORBX.jx

這項出人意料的解決方案是通過硬體虛擬化完全避開本機效能問題。不在電腦上而是在雲端執行應用程式,然後將結果以視訊的形式在電腦上呈現出來。該解決方案由Mozilla和Otoy用ORBX.js的形式提出,ORBX.js可以讓1080p視訊的編解碼完全通過JavaScript來完成。

http://www.youtube.com/watch?v=BV32Cs_CMqo

(Youtube 視訊)

視訊中你可以看到3D Studio Max分別在本機和通過ORBX.js在瀏覽器中執行的情景。這項技術顯然讓人印象深刻,但是它解決問題的同時也帶來了更多的問題。一切都被虛擬化以後,網路連線、延遲和頻寬就會成為新的瓶頸,而停電將會是最嚴重的災難。

但不管怎樣,看起來JavaScript的前途很是光明。

 

英文原文:John Dalziel,編譯:@AvisBlume

譯文連結:http://blog.jobbole.com/41922/

【非特殊說明,轉載必須在正文中標註並保留原文連結、譯文連結和譯者等資訊,謝謝合作!】

相關文章