BlinkOn9 - WebAssembly

作者在 4 月 18~19 期間和同事一起在灣區參加了為其兩天的 BlinkOn 9 會議。每次 BlinkOn 都是了解當前 Blink & Chrome 和 Web 技術演進現狀和發展方向的一個不錯機會,兩天的會議下來大概聽了 6 ~ 7 場分享,有些主題是之前已經有所了解,這次又更新了最新的進展信息;有些主題則是完全陌生,在這次 BlinkOn 上才第一次知悉。作者接下來會撰寫一系列文章,每篇文章針對一個特定的主題,儘可能把相關的信息回饋給讀者。

WebAssembly Overview

WebAssembly 整合了 Chrome 之前一直在搞的 Native Client/Portable Native Client 和 Firefox 的 asm.js,為 Web 技術的演進開闢了新的方向和更多的可能性。WASM 得到了眾多大佬的站台和各大瀏覽器引擎的一致支持,在 2017 年年底已經達成了第一個里程碑,Chrome,Firefox,Safari 和 Edge 都已經交付了所謂的 MVP 版本,標誌著 WASM 對開發者來說已經處於基本可用的狀態。

今年對 WASM 來說應該會是開始嶄露頭角的一年,一方面語言特性和開發工具鏈會進一步完善,達到真正可用的狀態;另一方面基於 WASM 開發的一些應用/引擎/庫也會逐步進入發布狀態,讓更多人開始真正體驗到 WASM 的潛力所在。

如果讀者對 WebAssembly 並不了解,希望可以快速有個完整的認識,推薦 YouTube 上的這個視頻 - WebAssembly and the Future of the Web。

WebAssembly for Developers

WebAssembly for Developers 是這次 BlinkOn 上乾貨比較多的一個分享,分享的內容主要包括兩部分:

  1. 當前在開發中的,使用了 WASM 的實際應用;
  2. 接下來的新增特性支持;

基於 WASM 開發中的應用,引擎和庫包括:

  1. AutoCAD 的 Web 版本;
  2. Google 地球的新版本;
  3. Unity 和 Unreal 遊戲引擎的 Web 版本;
  4. 其它的還包括人臉跟蹤,掃碼識別,各種視頻,圖像編碼/解碼器,區塊鏈應用等;

比較可惜的是還沒有一個正式發布可用的 Show Case 應用。

新增的特性支持是作者比較關注的,特別是多線程支持,SIMD 和 Web API 的直接調用。

多線程支持所需的相關特性是 SharedArrayBuffer 和 Atomics,SAB 早前是因為會被「熔斷」和「幽靈」這樣的時間攻擊漏洞所利用而在各大瀏覽器裡面被「下架」了,Chrome 近期就會修復相關的漏洞並重新「上架」。對於使用 C/C++ 語言的 WASM 開發者來說,直接使用 pthread API 即可,編譯器會自動生成相應的實現代碼。

SIMD 對於高性能計算來說重要性無需贅述。這也是 WASM 能夠跟 JavaScript 在計算性能上真正拉開差距的一個重要特性,Chrome 已經有一個原型實現,應該近期就會正式支持。

Web API 的直接調用對於希望使用 WASM 進行開發的 Web Game 來說非常重要,目前 WASM 調用 Web API 需要先經過 JavaScript 的 Wapper,這種轉接的方式性能損耗太大,對於一個普通 Web Game 來說,每一幀上千甚至幾千個 WebGL/Canvas API 調用都是很正常的,per API Overhead 就變得尤其重要了。好的消息是針對這個問題,Reference Types 和 Host Bindings 技術提供了一個在 WASM 直接操作 JavaScript + DOM 對象和調用其方法的解決方案,然後虛擬機的機器碼生成可以直接內聯相應的 Web API 調用代碼,生成的最終代碼相當於 WASM 直接調用瀏覽器 Web API 的 Native 實現代碼。我們跟 v8 團隊工程師後續的交流,根據他們的回復,最終 WASM 調用 Web API 的性能要更優於當前在 JavaScript 調用 Web API 的性能。當然壞消息就是,目前的進展是剛剛才開始,他們還無法制定具體的發布日期。

推薦閱讀:

從process.versions了解Node.js的構成
擁抱 prettier
零基礎轉行學習web前端遇見的那些坑要如何避免
從新的 Context API 看 React 應用設計模式
OSI-TCP/IP協議族

TAG:WebAssembly | Web開發 | 前端開發 |