Ruby也要支持WebAssembly

Ruby 3.2.0第一预览版已经发布,官方在这个版本添加许多功能和性能改进,而最值得注意的是,从Ruby开始加入对WebAssembly的支持,以鼓励开发人员在WebAssembly环境使用CRuby,另外,正规表达式现在加入超过时配置,避免Regexp执行的时间超过预期。

程序语言WebAssembly原本的设计目标,是要在网页浏览器中安全且快速的执行程序,后来跨出网页浏览器开始能够独立执行,Ruby官方提到,在各种环境高性能地执行程序,不仅是网页应用程序的需求,也是一般应用程序所需要的。

Ruby 3.2通过WASI提供对WebAssembly的支持,WASI是WebAssembly的模块化系统接口,能够支持WebAssembly跨平台用例。由于WebAssembly在虚拟机中执行,没有系统接口,无法在操作系统上运行,因此Mozilla在2019年推出了WASI,提供了一个标准化接口,使得WebAssembly能够扩展到更多的平台上。

Ruby加入对WebAssembly的支持,可让CRuby二进制文件在网页浏览器、无服务器边缘环境,和其他WebAssembly嵌入器上运行。

官方提到,由于WASI和WebAssembly仍在发展,而且基于安全理由,本身缺少一些功能,无法实例Ruby的Fiber、异常和垃圾回收等功能,因此CRuby使用JavaScript打包器Asyncify,以二进制文件转换技术,在用户空间控制执行,来弥补缺少的部分。另外,官方也在WASI之上创建了虚拟文件系统,开发者可以将Ruby应用程序打包成单个.wasm文件,让Ruby应用程序发布更加简单。

Ruby 3.2另一个新功能,则是在正规表达式加入超过时功能,由于Regexp比对可能花费意想不到的时间,而恶意攻击者可能借此以精心设计的输入,来对效率低下的正规表达式,发动DoS攻击,官方提到,通过在Ruby应用程序加入Regexp.timeout超过时设置,将可有效缓解DoS风险。不过Regexp.timeout是一个全局设置,开发者要对特殊Regexp使用不同的超过时配置,则需要进行额外的配置。