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

澳门新葡萄京所有网站 1

Zig 0.5.0 发布了。

澳门新葡萄京所有网站 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将会作为开源项目正式发布。项目官网

澳门新葡萄京所有网站 3

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

Zig 是一门通用编程语言,专为稳定性、可维护性和性能而设计,追求替代 C
语言在系统编程上的最佳地位。Zig 具有以下值得关注的特性:

链接更快

  • 手动管理内存
  • 与 C 语言竞争而非依赖它,Zig 标准库不依赖于 libc
  • 澳门新葡萄京所有网站,轻量而简单,专注于调试应用而不是调试编程语言的知识
  • 新的错误处理方法,与编写良好的 C 语言错误处理类似,但减少了很多冗余
  • 调试模式下优化了快速编译时间,并在不确定行为发生时使用堆栈跟踪崩溃
  • ReleaseFast 模式和 ReleaseSafe 模式
  • 泛型数据结构和函数
  • 通过协程实现并发
  • 导入 .h 头文件并直接使用 C 语言的类型、变量和函数
  • 导出要依赖 C 语言代码的函数,变量和类型,自动生成 .h 头文件
  • 可选类型而非空指针
  • 交叉编译是主要用例

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

0.5.0 版本经过 6 个月打磨,包括了 1541 次 commit,带来了许多新的内容。

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

Zig 跟随 LLVM 的步伐,前几天 LLVM 9 发布了,所以 Zig 目前升级到了 LLVM
9,不再兼容 LLVM 8。值得注意的是,这意味着 Zig 现在支持 RISC-V。同时 Zig
还可以以 Emscripten 为编译目标操作系统。Emscripten 是一个独特的 LLVM
后端,它可以将 LLVM 字节码编译成
JavaScript(asm.js),往上追溯其实也就是通过 Clang 将 C 和 C++
代码编译成 JavaScript(asm.js),可以大大简化现有代码在 Web
时代的重用。除了 asm.js,Emscripten 还支持 WebAssembly 这一更加先进的
Web 技术,通过与 asm.js 类似的机制,Emscripten 可以生成 WASM
二进制字节码。

澳门新葡萄京所有网站 4

目前 Emscripten 还不能自托管,之后可行的情况下,可以使用 WebAssembly
将其作为浏览器中的 Zig 沙箱选项。

速度更快,代码更小

语言特性层面的主要更新包括:

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

  • 切片类型不再具有字段访问,而是使用@typeInfo(Slice).Pointer.child
  • 枚举文字隐式 cast 为带标记的 union。
  • 允许将可选指针隐式 cast 为可选c_void指针。
  • 添加了*[N]T隐式 cast 到[*c]T
  • anyerror不再作为关键字。
  • @cmpxchgStrong 和 @cmpxchgWeak 现在在
    x86_64 上支持 128 位整数。
  • comptime_int现在隐式 cast 为comptime_float
  • @typeOf 现在保证没有运行时副作用。
  • noinline函数声明中添加了关键字。
  • 现在可以比较并集标记和枚举文字。
  • 单元素enum默认设置为u0comptime_int仍允许作为显式枚举标签类型。

澳门新葡萄京所有网站 5

完整更新内容查看发布公告:

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

澳门新葡萄京所有网站 6

总体而言,宏观基准代码大小平均减小了 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 的一般改进。

详情查看原文:

(文/开源中国)