程序语言Ruby圣诞更新,3.2.0开始支持WebAssembly

程序语言Ruby依照惯例在圣诞节推出更新,最新的Ruby 3.2.0加入基于WASI的WebAssembly支持,扩大Ruby可以运行的平台,而程序内JIT编译器YJIT经过一年测试,现在正式成为生产就绪的功能,另外,Ruby 3.2.0改进正规表达式功能,使应用程序更能够抵抗正规表达式DoS攻击(ReDoS)。

Ruby 3.2.0通过WASI提供WebAssembly支持,这使得CRuby二进制文件将可以在网页浏览器、无服务器边缘或其他类型的WebAssembly/WASI嵌入器中运行。官方提到,这项功能将鼓励开发人员在WebAssembly环境使用CRuby,其中一个使用案例便是TryRuby互动编辑器对CRuby支持,开发者已经可以在网页浏览器用到原汁原味的Ruby。

WebAssembly最初的发展用途,是要作为网页应用程序安全且高效的开发语言,但由于一般应用程序也有高效且安全的需求,所以WASI(WebAssembly System Interface)便诞生,让WebAssembly应用程序在没有系统接口的虚拟机,也能够与操作系统通信,而Ruby提供WebAssembly/WASI支持,使开发人员能够使用Ruby,开发可在WebAssembly环境中运行的应用程序。

官方提到,因为WASI与WebAssembly还在发展,同时也基于部分安全理由,因此缺少一些能够实例Fiber、异常处理和垃圾回收的功能。所以CRuby通过二进制转换技术Asyncify,控制用户空间的执行,弥补功能空缺。

另外,Ruby还在WASI上构建了虚拟文件系统,使开发者可以更简单地将Ruby应用程序打包成.wasm文件,简化Ruby应用程序的发布。

Ruby 3.1.0所加入的程序内JIT编译器YJIT,经过一年的测试,官方认为已经足够稳定,因此在Ruby 3.2.0转变成为正式功能。YJIT主要源自于Shopify,用于改善Ruby on Rails应用程序的技术,当初Ruby 2.6加入了MJIT(Method-based JIT)编译器,希望能达到Ruby 3的速度是Ruby 2三倍的目标,但因为MJIT的诸多限制,再加上MJIT没有针对Rails这类需要大量调用方法的工作负载优化,导致实际应用程序无法获得MJIT的加速。

而YJIT是重新构建的JIT编译器,与现有Ruby程序代码几乎完全兼容,具有高速预热和性能提升等优点,在许多测试基准都有不少的速度提升。

Ruby 3.2.0所带来的正式版YJIT拥有多项功能改进,现在YJIT可以支持Linux、MacOS、BSD和其他UNIX平台上的x86-64和arm64/aarch64 CPU,这个版本可以被用于Apple M1/M2、AWS Graviton、Raspberry Pi 4环境,而Ruby 3.2.0的YJIT也比Ruby 3.1.0更快,内存使用量大概只有测试版本的三分之一。整体而言,以yjit-bench基准进行测试,YJIT比Ruby解释器还要快41%。

开发团队在Ruby 3.2.0针对ReDoS加入缓解措施。因为正规表达式比对可能花费超过预期的时间,当应用程序能够接受不受信任的输入,用于低性能的正规表达式比对,攻击者便有机会加以利用,进行有效的DoS攻击。

而Ruby 3.2.0的正规表达式比对算法使用记忆化(Memoization)技术,因此性能获得改进,90%的比对都可以线上性时间内完成,除此之外,开发者现在也可以利用正规表达式超过时功能,限制正规表达式的执行时间,以缓解正规表达式DoS攻击。