作者在 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 的性能。当然坏消息就是,目前的进展是刚刚才开始,他们还无法制定具体的发布日期。