快捷搜索:

您的位置:澳门新葡4473网站 > 新闻社区 > Duetto:更快更智能的C++/JavaScript代码转换器

Duetto:更快更智能的C++/JavaScript代码转换器

发布时间:2020-04-15 14:39编辑:新闻社区浏览(54)

    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%。

    这样的改进得益于:

    • 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 的一般改进。

    详情查看原文:

    (文/开源中国)    

    本文由澳门新葡4473网站发布于新闻社区,转载请注明出处:Duetto:更快更智能的C++/JavaScript代码转换器

    关键词:

上一篇:10大广泛使用的Linux发行版

下一篇:没有了