WebAssembly:面向Web的通用二進制和文本格式
Mozilla、谷歌、微軟和蘋果已經決定開發一種面向Web的二進制格式。該格式名為WebAssembly,可以作為任何編程語言的編譯目標,使應用程序可以運行在瀏覽器或其它代理中。
幾年前,我們在InfoQ上討論過面向Web的通用字節碼的優點(見《 討論:我們是否需要一種通用的Web字節碼? 》),概括了創建這樣一種格式的困難。其中提及的一個主要問題是主要的瀏覽器制造商無法達成一致:Mozilla在推asm.js,谷歌支持PNaCI,蘋果在開發 FLTJIT ,而微軟沒有對其中的任何一種表示出興趣。但現在,情況已經發生了變化。所有四個主要的瀏覽器供應商一致同意創建一種面向Web的二進制格式 WebAssembly 或WASM/wasm。 有人將其稱為字節碼 ,但wasm不是傳統意義上的字節碼, Brendan Eich指出 :“WebAssembly實際上是一個經過壓縮的AST編碼,而不是一堆字節碼。小聲點,不要告訴任何人。如果愿意,你還是可以稱它為字節碼。”
迄今為止,這個項目一直是秘密進行的,但現在,它已經在 GitHub 上和 W3C社區組 里公開。WebAssembly的初衷是,讓使用JavaScript之外的語言編寫的程序可以運行在服務器、移動或IoT設備上的瀏覽器和其它JS代理中。這種格式最終將取代asm.js和PNaCI。根據項目 設計文檔 (尚未最終確定),WASM使用二進制是因為它“可以提供更高的效率:它減少了下載文件大小,并加快了解碼速度,因此,即使很大的代碼庫也可以快速啟動。”WASM有一個相對應的文本格式,可以供調試器或其它面向開發者的工具使用。這些工具應該能夠從一種格式轉換成另外一種格式,而且不會丟失信息。
WebAssembly實現工作已經邁出了一個臨時的第一步:將該格式轉換成相應的asm.js代碼,那樣,它就可以運行在支持asm.js的瀏覽器上:Firefox、Edge、Chrome。已經有一個以此為目的構建的 polyfill原型 ,初步結果顯示,壓縮后的二進制格式比asm.js壓縮后要小20-30%,wasm解碼速度比解析相應的asm.js源代碼要快大約23倍。WASM稍后將獲得瀏覽器VM的原生支持。
WebAssembly將首先把C/C++程序帶給Web,但稍后會通過增強實現對其它任何語言的支持。一個LLVM后端和clang移植已經在計劃上。WASM將運行在“和JavaScript相同的語義空間”,支持從/到JavaScript的異步調用,訪問所有的瀏覽器API,并且遵循 JavaScript程序所遵循的安全策略。客戶端應用程序可以完全用WASM編寫,也可以用WASM實現業務邏輯,而用HTML/CSS /JavaScript實現UI。
緊跟著JavaScript的第二十個生日宣布,并且是在 Ecma宣布ES6規范獲最終批準 的當天,WebAssembly對JavaScript而言可不是一個好消息。WASM將使得使用任何能夠編譯成WASM的語言編寫Web代碼成為可能,
JavaScript將直接與其它語言競爭。我們是否可以期待Java或C#編譯成WASM呢?
WebAssembly將從開發asm.js和PNaCI的經驗教訓中獲益,因為創建它的團隊中包含了來自Mozilla和谷歌的團隊。而微軟和蘋果的支持使它成為了一個非常有前途的項目。剩下的唯一問題是時間:通常,由多個大型公司共同開發的項目需要花費大量的時間。在這種情況下,標準化過程非常緩慢。