NaCl
使用SFI技術,使瀏覽器能夠安全地運行原生代碼,並可使用CPU的所有功能,PNaCl爲NaCl
增長了可移植性c++
PNaCl
與NaCl
的編譯與運行git
PNaCl
經過Pepper與瀏覽器JS之間通訊github
NaCl的廢棄web
除Chrome之外,其它瀏覽器廠商認爲使用NaCl(PNaCl),應用程序將運行在一個黑盒中,對其安全性產生質疑。最終2017年5月,NaCl被廢棄,取而代之的是WebAssembly
chrome
asm.js
爲開發人員提供了一種將c/c++源碼轉換爲JS的方法(JS的嚴格子集)。例如使用Emscripten,c/c++代碼能夠編譯爲asm.js,js引擎識別到asm.js將會將其直接轉換爲彙編,利用WebGL經過GPU執行asm.js,極大的提高運行速度。其次asm.js
模塊也能夠與JS模塊交互npm
JS的AOT編譯api
asm.js
是WebAssembly最小可行產品(MVP)的基礎瀏覽器
asm.js
的缺點:asm.js是一個文本文件,在進行任何編譯前必須經過網絡傳輸,而Webassembly則採用二進制格式,其體積更小,所以傳輸效率更高緩存
2015年4月,W3C成立WebAssembly工做組,用於監督與規範WebAssembly提案,倡導瀏覽器廠商使用一致性的規範。安全
WebAssembly是一個底層虛擬機,.wasm 是基於堆棧虛擬機的二進制指令格式,WebAssembly的設計目標是編譯高級語言(c/c++/Rust等),提供可移植的結果,支持部署到web端及服務端
堆棧虛擬機
由兩個元素組成:棧(數據結構)、指令,棧存在兩個操做:push、pop,遵循後進先出
,棧還包括指向棧頂項的指針。指令表示要對棧裏面項執行的操做。
示例,下面ADD指令會彈出棧頂兩項,通過求和指令後,將結果推回棧:
WebAssembly的MVP專一於C/C++,因此編譯主要是經過Clang/LLVM/Emscripten等實現
當瀏覽器獲取到.wasm
文件(二進制),JS引擎將使用解碼棧解碼,將wasm文件轉換爲AST,執行類型檢查,並將其解釋爲執行函數。示例圖:
說明
階段 | 說明 |
---|---|
Decoding | 解碼,將二進制格式轉換爲模塊 |
Validation | 驗證,對解碼後的模塊進行驗證(如類型檢查),以確保模塊良好且安全 |
Phase-1: Instantiation | 實例化第一階段,經過Globals、Memories、Tables,生成初始化模塊實例,並調用start()函數 |
Phase-2: Invocation | 實例化第二階段,導出函數:從模塊實例調用 |
雖然以上應用也可使用JS,但使用WebAssembly能夠極大的提高其性能,而且經過二進制文件能夠極大的減小js編譯後文件(例如React的bundle)大小,在頁面上加載實例化wasm模塊能夠加快代碼執行(WebAssembly自身線程)
Emscripten
是一個LLVM-to-JS
的編譯器,其接受諸如Clang編譯產出的LLVM位碼輸出,並將其轉換爲JS。Emscripten
是一種構建、編譯、運行asm.js的技術組合。
生成wasm模塊,可使用Emscripten SDK
管理器: