Emscripten 是一个独特的 LLVM 后端,它可以将 LLVM 字节码编译成 JavaScript(asm.js),往上追溯其实也就是通过 Clang 将 C 和 C++ 代码编译成 JavaScript(asm.js),可以大大简化现有代码在 Web 时代的重用。除了 asm.js,Emscripten 还支持 WebAssembly 这一更加先进的 Web 技术,通过与 asm.js 类似的机制,Emscripten 可以生成 WASM 二进制字节码。 原本 Emscripten 的 WebAssembly 后端用的是 fastcomp,但之前已经增加了 LLVM WebAssembly 后端选项,并且二者保持并行开发。近期 JS 引擎 V8 官方发表博客表示很快将默认使用 LLVM WebAssembly 作为 Emscripten 的 WebAssembly 后端,因为 LLVM WebAssembly 后端现在在大多数指标上都已经超越了 fastcomp 后端。V8 团队介绍了具体原因,并给出了基准测试结果: 链接更快 LLVM WebAssembly 后端加上 基准测试结果是 LLVM WebAssembly 链接速度是 fastcomp 的 7 倍: 速度更快,代码更小 LLVM WebAssembly 后端技术栈在基准测试中速度和代码大小都击败了 fastcomp。 宏观基准测试结果是速度平均提升了 3.2%。 总体而言,宏观基准代码大小平均减小了 3.7%,而在实际项目中,Cube 2 游戏引擎的 Web 移植版本 BananaBread,减小了 6% 以上,Doom 3 则减小了 15%。 这样的改进得益于:
支持所有 LLVM IR fastcomp 可以处理由 新的 WebAssembly 功能 fastcomp 在运行 来自上游更快的常规更新 使用上游 WebAssembly 后端意味着可以始终使用最新的 LLVM 上游,这意味着可以尽快获得 切换到默认 LLVM WebAssembly 后,fastcomp 仍然是一个可选项,V8 团队表示最终会完全删除 fastcomp,这样做可以消除重大的维护负担,能够更多地关注于 WebAssembly 后端的新功能,并且加速 Emscripten 的一般改进。 详情查看原文: |