1、WebAssembly是什么
首先,WebAssembly是一種技術方案統稱,主要用於移植非js代碼到瀏覽器環境中執行。
為什么要移植其他代碼,是js不香了么?
①:得益於先天的語言特性untyped,在所有編程語言中,js的執行速度屬於末流;(首先,它慢)
②:隨着web領域的發展,需要承載的需求越來越多,需要提供的能力要求也越來越高。(地圖、游戲、制圖等高性能需求場景出路在哪里)
③:性能優化是一個持久命題,再快點,再好點
2、wasm比js快么?為什么快?快多少?
①:javascript本質是文本,wasm是二進制字節碼,體積更小
②:靜態類型,不需要針對動態類型進行編譯優化
③:wasm更接近機器碼,解析效率更好
差距參考 1 : 3 : 17
3、如何使用wasm
環境:git cmake python2.7.x
工具: emscripten (github、安裝教程),這個是必備的
wabt(github),為了讀編譯后的代碼
大體流程:
編譯:編譯心儀的代碼為wasm
執行:①加載字節碼;②編譯字節碼;③實例化
3-1 編譯:
安裝emsdk之后,使用emcc命令編譯文件,示例:
emcc a.c -Os -s WASM=1 -s SIDE_MODULE=1 -o a.wasm
3-2 執行:
// 封裝的異步loader function load(path) { return fetch(path) // 獲取二進制buffer .then(res => res.arrayBuffer()) // 編譯&實例化,導入js對象 .then(bytes => WebAssembly.instantiate(bytes, importObj)) // 返回實例 .then(res => res.instance) } load("./test_demo/a.wasm").then(instance => { // 導出模塊中的函數 console.log(instance) const {add} = instance.exports console.log(add(1,2)) })
其他:assemblyscript