Emscripten 将默认 LLVM WebAssembly 为 WASM 后端

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

澳门新葡亰游戏网址 1

澳门新葡亰游戏网址 2

Duetto是一个编译器,可以将C++程序编译为二进制代码和Javascript代码,这允许开发者使用单一的C++代码库编写高性能的分布式Client/Server应用。Duetto的作用为了使Web应用的执行速度接近于本地应用,科技巨头开始探索使用底层语言开发Web应用的可能性。Mozilla带来了asm.js,这是一个JavaScript子集,可以被用来作为一个底层的、高效的编译器目标语言,也就是说开发者可以将本地应用编译为该语言或JavaScript,以实现更高的性能。目前比较知名的解决方案是Emscripten,这是一个基于LLVM的编译器,可以将任何通过
LLVM 前端生成的 LLVMIR 中间码编译成
JavaScript。Duetto类似于Emscripten,同样基于LLVM。但Duetto的开发人员表示,Duetto比Emscripten更快、更智能。更智能的Emscripten替代品Emscripten通过模拟一个完整的字节寻址地址空间来处理C++代码,尽管这是一个很好的解决方案,但是不太理想。因为JavaScript不是基于字节寻址地址模式的,而是基于对象寻址模式——所有内存被包含在一个对象中。而C++没有什么不同。Duetto的做法是——集成了clang和LLVM工具链,能够将C++面向对象的结构映射为本地JavaScript对象。事实证明,在现代JavaScript引擎上,访问对象比访问数组要更快。Duetto开发人员给出了以下基准测试结果:目前状态Duetto开发人员表示,目前该编译器的后端已经开发完备,已经可以将C++应用程序编译为Web应用,尤其是游戏应用。但是Duetto前端还不太完善,目前Duetto开发人员的首要任务是改进bug报告,使用户的移植体验更加平滑。Duetto开发人员称,未来6个月内,Duetto将会作为开源项目正式发布。项目官网

原本 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 倍:

澳门新葡亰游戏网址 3

速度更快,代码更小

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

澳门新葡亰游戏网址 4

澳门新葡亰游戏网址,宏观基准测试结果是速度平均提升了 3.2%。

澳门新葡亰游戏网址 5

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

网站地图xml地图