IT资讯 Emscripten 将默认 LLVM WebAssembly 为 WASM 后端

yves · 2019-08-06 09:30:06 · 热度: 44

Emscripten 是一个独特的 LLVM 后端,它可以将 LLVM 字节码编译成 JavaScript(asm.js),往上追溯其实也就是通过 Clang 将 C 和 C++ 代码编译成 JavaScript(asm.js),可以大大简化现有代码在 Web 时代的重用。除了 asm.js,Emscripten 还支持 WebAssembly 这一更加先进的 Web 技术,通过与 asm.js 类似的机制,Emscripten 可以生成 WASM 二进制字节码。

Emscripten 将默认 LLVM WebAssembly 为 WASM 后端

原本 Emscripten 的 WebAssembly 后端用的是 fastcomp,但之前已经增加了 LLVM WebAssembly 后端选项,并且二者保持并行开发。近期 JS 引擎 V8 官方发表博客表示很快将默认使用 LLVM WebAssembly 作为 Emscripten 的 WebAssembly 后端,因为 LLVM WebAssembly 后端现在在大多数指标上都已经超越了 fastcomp 后端。V8 团队介绍了具体原因,并给出了基准测试结果:

链接更快

LLVM WebAssembly 后端加上wasm-ld可以完全支持 WebAssembly 目标文件增量编译。fastcomp 在字节码文件中使用 LLVM IR,这意味着在链接时,所有 IR 都将由 LLVM 编译,所以 fastcomp 链接慢。另一方面,WebAssembly 对象文件 .o 包含已编译的 WebAssembly,它们可以像原生链接一样链接,因此,链接步骤可以比使用 fastcomp 快得多。

基准测试结果是 LLVM WebAssembly 链接速度是 fastcomp 的 7 倍:

Emscripten 将默认 LLVM WebAssembly 为 WASM 后端

速度更快,代码更小

LLVM WebAssembly 后端技术栈在基准测试中速度和代码大小都击败了 fastcomp。

Emscripten 将默认 LLVM WebAssembly 为 WASM 后端

宏观基准测试结果是速度平均提升了 3.2%。

Emscripten 将默认 LLVM WebAssembly 为 WASM 后端

总体而言,宏观基准代码大小平均减小了 3.7%,而在实际项目中,Cube 2 游戏引擎的 Web 移植版本 BananaBread,减小了 6% 以上,Doom 3 则减小了 15%。

这样的改进得益于:

  • LLVM 的后端代码比较智能,可以做像 fastcomp 这样的简单后端无法做到的事情,比如 GVN(Global value numbering,全局值编码)。
  • 新的 LLVM 具有更好的 IR 优化。
  • 团队在 WebAssembly 后端输出调整 Binaryen 优化器方面做了许多工作。

支持所有 LLVM IR

fastcomp 可以处理由 clang 产出的 LLVM IR,但因为架构原因经常会在其它源上失败,特别是在将 IR 合法化为 fastcomp 可以处理的类型时。另一方面,LLVM WebAssembly 后端使用通用的 LLVM 后端基础结构,因此可以处理所有内容。

新的 WebAssembly 功能

fastcomp 在运行 asm2wasm 之前编译出 asm.js,这意味着很难处理新的 WebAssembly 功能,如尾调用、异常与 SIMD 等。

来自上游更快的常规更新

使用上游 WebAssembly 后端意味着可以始终使用最新的 LLVM 上游,这意味着可以尽快获得 clang 中新的 C++ 语言功能、新的 LLVM IR 优化等。

切换到默认 LLVM WebAssembly 后,fastcomp 仍然是一个可选项,V8 团队表示最终会完全删除 fastcomp,这样做可以消除重大的维护负担,能够更多地关注于 WebAssembly 后端的新功能,并且加速 Emscripten 的一般改进。

详情查看原文:

https://v8.dev/blog/emscripten-llvm-wasm

猜你喜欢:
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册