Webassembly 的里程碑:在多個瀏覽器的實驗性支持

Webassembly 是一個新興的標準,其目標是定義一個安全、輕型、高性能的二進制編譯器,其目的是爲 web 提供一個接近於原生的虛擬 CPU。Webassembly 正由一個 W3C 社區組(CG)開發,其成員包括Mozilla,微軟,谷歌和蘋果。
javascript

咱們很高興地宣佈,webassembly 已經到達了一個重要的里程碑:如今實現了多個可交互操做的實例。在標準實施以前,咱們仍然有不少工做要作,但這是一個很好的機會去展現咱們到目前爲止的進展,並談論將來的發展方向,同時獲取反饋。java

爲何須要 Webassembly?

asm.js 這個底層 JavaScript 子集已經證實瀏覽器實現安全沙盒和接近本機的計算性能是有可能的,而且目前網絡對這種能力有着巨大的需求。感謝 Emscripten 編譯器,咱們已經看到了用於應用的多樣化和不斷增加的陣列,包括映射,加密,壓縮,遊戲,CAD,圖像編輯,以及面部識別的 asm.js 實現。web

爲了 Web 將來的發展,WebAssembly CG 在去年成立,以標準化的二進制格式使 JavaScript 的存儲大小和解碼時間大大優化。如此另闢蹊徑,經過一個新的標準,WebAssembly 將來將會從 JavaScript 的發展路線中獨立出來。瀏覽器

與此同時,咱們知道了 WebAssembly 對於 Web 是很重要的:」它有訪問現有 Web API 的能力,而且能和 JavaScript 緊密集成,例如,容許 WebAssembly 和 JavaScript 之間的相互調用。不一樣於傳統方式安裝的插件,這將使 WebAssembly 可以更容易地集成到 JavaScript 應用程序和庫中,就像 asm.js 已經可以作到的同樣。緩存

最後,咱們已經可以利用咱們與 Emscripten 和 asm.js 經驗引導並集中進行 WebAssembly 的初步設計。並且關鍵的是,現代瀏覽器對 asm.js 的強大性能支持,使得可以建立 polyfills,容許開發者開始使用 WebAssembly 在它尚未在瀏覽器裏原生實現以前安全

進展

回到今天,CG 已經取得了顯著的進展。在 WebAssembly GitHub 的組織內,已經產生了:網絡

  • 一些定義並計劃將來形態的初始功能的說明;app

  • 一些說明書和參考解釋;異步

  • 13000 行的測試用來驗證這兩個規範解釋器和進行瀏覽器測試;ide

  • 二進制格式的初稿

更重要的是,四個瀏覽器引擎的工程師已經實現了 WebAssembly 的原型。在 Firefox 瀏覽器中,咱們重構現有 asm.js 的優化管道,使用了 WebAssembly 二進制格式做爲 asm.js 碼,將其從主解析線程發送到後臺編譯器線程。

該優化過程經過將兩個耗時步驟(MIR 和代碼生成)從順序關鍵路徑移除,顯著提升了 asm.js 的並行編譯性能。有了這個重構後的管道,原生的 WebAssembly 解碼只須要增長一個小小的步驟,以驗證不可信字節:

想了解關於以上 JS 和 asm.js 編譯的詳細背景和定義,能夠參考這篇博客文章。

Webassembly 實驗

根據上述幾點,咱們如今能夠在多個實驗環境下實現運行 WebAssembly 的 Demo。咱們爲何要說「實驗」,由於直到第一個穩定的版本出來以前,在接下來的幾個月WebAssembly 二進制格式和 JS 綁定可能會出現不兼容。咱們不但願這些實現是不夠成熟和沒有通過一段時間的壓力測試的。然而在全部瀏覽器的相同頁面上可以運行,這又是具備里程碑意義的,使得咱們能夠繼續同步地進行迭代。

說了這麼多,不如看一個真實的在多種瀏覽器上運行的 demo

圖片

這種特殊的 Demo 有一些懷舊情節:AngryBots 實際上是一個 Unity 3D 的基礎教程項目,同時也是爲了測試 Unity 對 WebGL 形式輸出支持的一個跑分測試。

要運行 Demo,能夠下載 Nightly 來構建,打開 about:config 並設置 javascript.options.wasm 爲true。

[小編注]:Nightly 是 Mozilla 的一個開發版瀏覽器。

通往正式版之路

那麼下一步該幹什麼呢?在一個穩定的,可裝運的第一個版本發佈前咱們還有更多的工做要作。在CG,一些大的待完成的任務有:

  • 定義正式的 WebAssembly 格式。

  • 進一步減小二進制格式的大小。雖然當前的二進制格式比 asm.js 壓縮了(使用 gzip 以後小 12%)42%,若是按照之前的二進制格式原型來工做,尺寸將更小。

  • WebAssembly 的 JavaScript API 迭代。目前的實驗構建了一個新定義的同步方法 Wasm.instantiate,作了編譯和實例化。目前也有設想掰開這些步驟,並提供一些同步和異步函數來得到一個結構化的可複製對象。這能爲開發人員提供了更多的能力去控制編譯和機器代碼緩存的過程,這比 asm.js 更增強大。

  • 爲編譯器做者,工具開發者,極客和學生建立更平易近人的文檔。

  • 添加更多的測試到測試套件。

在Firefox,咱們也計劃:

  • 將對於 WebAssembly 的支持添加到瀏覽器的開發工具中,包括調試器和分析器等。正巧,JavaScript中,Developer Tools 和 Firebug 的團隊攜手在更新工具,更新爲一種新的,抽象的,可單元測試的調試器,調試器的 API 中咱們會加入關於 WebAssembly 的代碼。事實上,這項工做已經開始了,這就是爲何在上面的 Demo 運行時你打開調試器選項卡,能夠看到的二進制代碼生成的佔位符。

  • 進一步下降代碼冷加載時間。在 16×2.4GHz 核心的 Linux 桌面上測試 AngryBots 編譯時間,WebAssembly 使之減小了約 52% 的編譯時間。這是一個良好的開端,事實證實 WebAssembly 解碼目前比 asm.js 解析速度快將近 10 倍。可是咱們還能夠進一步經過優化在編譯管道的其餘部分的工做減小代碼冷加載時間。

  • 完成添加全套的 WebAssembly 操做並導入測試套件。

全速前進

WebAssembly 迄今取得的進展一直使人振奮。我一直爲此印象深入,並讚揚整個WebAssembly CG 的合做氣氛。若是您想了解更多,咱們的GitHub的組織頁面是一個很好的起點。Happy hacking!

 

Linux Story 小編舒適提示,更多詳情請訪問以下原文連接。

原文連接:https://hacks.mozilla.org/2016/03/a-webassembly-milestone

相關文章
相關標籤/搜索