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 上乾貨比較多的一個分享,分享的內容主要包括兩部分:
- 當前在開發中的,使用了 WASM 的實際應用;
- 接下來的新增特性支持;
基於 WASM 開發中的應用,引擎和庫包括:
- AutoCAD 的 Web 版本;
- Google 地球的新版本;
- Unity 和 Unreal 遊戲引擎的 Web 版本;
- 其它的還包括人臉跟蹤,掃碼識別,各種視頻,圖像編碼/解碼器,區塊鏈應用等;
比較可惜的是還沒有一個正式發布可用的 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開發 | 前端開發 |