導讀:
JavaScript存在什么問題
webAssembly是什么
WebAssembly是如何工作的
WebAssembly能解決什么問題
WebAssembly當前的局限性
demo 案例
JavaScript存在什么問題
JavaScript語言特點:解釋執(zhí)行(動態(tài)語言)定血、弱類型
JavaScript執(zhí)行過程如下:解析—編譯/編譯優(yōu)化—優(yōu)化—執(zhí)行—垃圾回收
對比靜態(tài)語言執(zhí)行過程:解碼-編譯/編譯優(yōu)化-執(zhí)行
結論:JavaScript不適用CPU密集型和高性能應用
webAssembly是什么
WebAssembly (abbreviated Wasm) is a binary instruction format for a stack-based virtual machine. Wasm is designed as a portable compilation target for programming languages, enabling deployment on the web for client and server applications.
WebAssembly(縮寫為 Wasm)是一種基于堆棧式虛擬機的二進制指令集铃绒。Wasm 被設計成為一種編程語言的可移植編譯目標,并且可以通過將其部署在 Web 平臺上,以便為客戶端及服務端應用程序提供服務
相關概念
1、堆棧機
一個簡單的堆棧機計算模型示例如下:
一個簡單的1+2求和程序
計算過程
i32.const 1 | 1
i32.const 2 | 1,2
i32.add | 3
2、指令集
參考上圖,計算機的主要架構如上。最底層是 CPU 的指令集旺罢,主要分為復雜指令集和簡單指令集。復雜指令集是 x86绢记、x64(也叫 x86-64, amd64) 兩種架構扁达,專利在 Intel 和 AMD 兩家公司手里, 該架構 CPU 主要是 Intel 和 AMD 兩家公司庭惜,這種 CPU 常用在 PC 機上罩驻,包括 Windows,macOS 和 Linux护赊。簡單指令集是 arm 一種架構惠遏,專利在 ARM 公司手里砾跃,該架構 CPU 主要有高通、三星节吮、蘋果抽高、華為海思、聯(lián)發(fā)科等公司透绩。這種 CPU 常用在手機上翘骂,包括安卓和蘋果。
這里是一個c++階乘函數(shù)編譯為Wasm指令的示例(準確的說WAT并不是指令帚豪,而是WebAssembly 可讀文本格式)
這里的每一條指令都是指令集規(guī)定的內(nèi)容碳竟,規(guī)定了操作碼、操作數(shù)以及具體的功能狸臣。當然這里用WAT格式展示莹桅,主要是為了我們?nèi)祟悂碜x寫。實際存儲文件(Wasm)還是轉(zhuǎn)成 的0,1 序列烛亦。上邊每個單詞都會有一個數(shù)字相對應
WebAssembly是如何工作的
1诈泼、瀏覽器執(zhí)行Wasm過程:加載-編譯-實例化-調(diào)用(執(zhí)行)
2、c語言轉(zhuǎn)Wasm在線工具--WasmFiddle
3煤禽、c++語言轉(zhuǎn)Wasm在線工具--WasmExplorer
WebAssembly能解決什么問題
1铐达、web端
- 使用 Wasm 完全重寫現(xiàn)有框架使用
- Wasm 重寫現(xiàn)有框架的核心邏輯
- 使用 Wasm 配合框架增強應用的部分功能
- 使用其他語言構建 Web 前端框架
2、not in web
WebAssembly當前的局限性
1檬果、web兼容度
2瓮孙、無法直接引用 DOM
3、復雜數(shù)據(jù)類型需要進行編解碼
demo 案例
1汁汗、eBay 的條形碼掃描
eBay 在原生應用中有專門的 C++ 庫用于條形碼的掃描衷畦,在 H5 中利用開源 JavaScript 庫 BarcodeReader 做了一個帶條形碼掃描功能的Web版本。 問題是它只有在 20% 的時間表現(xiàn)良好知牌。 剩余的 80% 的時間運行非常緩慢纹腌,準確率也不高凡傅。最終的解決方案是通過 Wasm ,將原有的 c++ 庫引入死相,以及業(yè)界十分有名的忿墅、基于 C 語言編寫的開源條形碼掃描庫 ZBar 引入扁藕,再加上原本的 js 庫,三者協(xié)助疚脐,最終識別率達到了 100%亿柑。
技術方案設計如下圖所示。
產(chǎn)品上線后的最終效果如下圖所示棍弄。
產(chǎn)品在上線使用了一段時間后望薄,
eBay
技術團隊對應用的條形碼掃描情況進行了統(tǒng)計疟游,結果發(fā)現(xiàn)有 53%
的成功掃描來自于 ZBar
;34%
來自于自研的 C++
庫痕支。剩下的 13%
則來自于第三方的 JavaScript
庫實現(xiàn)颁虐。可見卧须,其中通過 Wasm
實現(xiàn)得到的掃描結果占據(jù)了總成功次數(shù)的 87%
另绩。
更詳細的過程可以參考 WebAssembly在eBay的實踐:速度提升50倍