由 naruse 于 2022 年 4 月 3 日发布
我们很高兴地宣布 Ruby 3.2.0-preview1 的发布。Ruby 3.2 添加了许多功能和性能改进。
基于 WASI 的 WebAssembly 支持
这是基于 WASI 的 WebAssembly 支持的初始端口。这使得 CRuby 二进制文件可以在 Web 浏览器、无服务器边缘环境和其他 WebAssembly/WASI 嵌入器上使用。目前,此端口通过了不使用 Thread API 的基本和引导测试套件。
背景
WebAssembly (Wasm) 最初是为了在 Web 浏览器中安全快速地运行程序而引入的。但其目标 - 在各种环境中高效且安全地运行程序 - 不仅是 Web,也是通用应用程序长期以来所需要的。
WASI (WebAssembly 系统接口) 是为这些用例设计的。虽然这些应用程序需要与操作系统通信,但 WebAssembly 在虚拟机上运行,该虚拟机没有系统接口。WASI 使其标准化。
Ruby 中对 WebAssembly/WASI 的支持旨在利用这些项目。它使 Ruby 开发人员能够编写在这些有前景的平台上运行的应用程序。
用例
此支持使开发人员能够在 WebAssembly 环境中使用 CRuby。一个用例是 TryRuby 游乐场 的 CRuby 支持。现在您可以在 Web 浏览器中尝试原始的 CRuby。
技术要点
由于 WASI 和 WebAssembly 本身仍在发展,并且出于安全原因,它们缺少一些实现 Fiber、异常和 GC 的功能。因此,CRuby 通过使用 Asyncify 来弥补差距,Asyncify 是一种在用户空间中控制执行的二进制转换技术。
此外,我们构建了一个基于 WASI 的 VFS,以便我们可以轻松地将 Ruby 应用程序打包成单个 .wasm 文件。这使得 Ruby 应用程序的发布更容易。
相关链接
正则表达式超时
引入了正则表达式匹配的超时功能。
Regexp.timeout = 1.0
/^a*b?a*$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second
众所周知,正则表达式匹配可能需要出乎意料的长的时间。如果您的代码尝试将一个可能低效的正则表达式与不受信任的输入进行匹配,攻击者可能会利用它进行有效的拒绝服务攻击(所谓的正则表达式 DoS 或 ReDoS)。
可以通过根据 Ruby 应用程序的要求配置 Regexp.timeout
来预防或显著缓解 DoS 的风险。请在您的应用程序中尝试一下,并欢迎您的反馈。
请注意,Regexp.timeout
是一个全局配置。如果您想为某些特殊的正则表达式使用不同的超时设置,您可能需要为 Regexp.new
使用 timeout
关键字。
Regexp.timeout = 1.0
# This regexp has no timeout
long_time_re = Regexp.new("^a*b?a*$", timeout: nil)
long_time_re =~ "a" * 50000 + "x" # never interrupted
原始提案是 https://bugs.ruby-lang.org/issues/17837
其他值得注意的新功能
不再捆绑第三方源代码
-
我们不再捆绑像
libyaml
、libffi
这样的第三方源代码。-
libyaml 源代码已从 psych 中删除。您可能需要在 Ubuntu/Debian 平台上安装
libyaml-dev
。软件包名称在其他平台上可能有所不同。 -
libffi 将在 preview2 中从
fiddle
中删除
-
语言
- 查找模式不再是实验性的。
性能改进
自 3.1 以来的其他值得注意的更改
- 哈希
- 如果哈希为空,则 Hash#shift 现在总是返回 nil,而不是返回默认值或调用默认 proc。[[Bug #16908]]
- MatchData
- 已添加 MatchData#byteoffset。[[Feature #13110]]
- 模块
- 已添加 Module.used_refinements。[[Feature #14332]]
- 已添加 Module#refinements。[[Feature #12737]]
- 已添加 Module#const_added。[[Feature #17881]]
- Proc
- Proc#dup 返回子类的实例。[[Bug #17545]]
- Proc#parameters 现在接受 lambda 关键字。[[Feature #15357]]
- Refinement
- 已添加 Refinement#refined_class。[[Feature #12737]]
- 集合
- Set 现在可以作为内置类使用,而无需
require "set"
。[[Feature #16989]] 它目前通过Set
常量或调用Enumerable#to_set
进行自动加载。
- Set 现在可以作为内置类使用,而无需
- 字符串
- 已添加 String#byteindex 和 String#byterindex。[[Feature #13110]]
- 将 Unicode 更新到 14.0.0 版本和 Emoji 14.0 版本。[[Feature #18037]](也适用于正则表达式)
- 已添加 String#bytesplice。[[Feature #18598]]
- 结构体
- Struct 类也可以使用关键字参数初始化,而无需在
Struct.new
上使用keyword_init: true
[[Feature #16806]]
- Struct 类也可以使用关键字参数初始化,而无需在
标准库更新
-
以下默认 gem 已更新。
- 待定
-
以下捆绑 gem 已更新。
- 待定
-
以下默认 gem 现在是捆绑 gem。您需要在 bundler 环境下将以下库添加到
Gemfile
。- 待定
通过这些更改,自 Ruby 3.1.0 以来,1058 个文件已更改,34946 个插入(+),29962 个删除(-)!
下载
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.tar.gz
SIZE: 20728782 SHA1: 7c4197e67f230b0c5d011f4efb9b9158743a61c8 SHA256: 6946b966c561d5dfc2a662b88e8211be30bfffc7bb2f37ce3cc62d6c46a0b818 SHA512: d24e77161996c2085f613a86d1ed5ef5c5bf0e18eb459f6a93a0014a5d2ce41079283b4283d24cb96448a0986c8c6c52a04584abd4e73911ea59cefeb786836e
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.tar.xz
SIZE: 15011400 SHA1: 6bcc30ac670ab391997e0d68ba97b451db078934 SHA256: 6d28477f7fa626b63bf139afd37bcfeb28fce6847b203fa10f37cb3615d0c35d SHA512: 0eca2c346b995d265df2659b4215ff96e515c29926c2a6256caad99db9c4c51fec1a2d899ca63a00010d4111060dc0fdd4f591be84c0a2c43b6303879de3c5de
-
https://cache.ruby-lang.org/pub/ruby/3.2/ruby-3.2.0-preview1.zip
SIZE: 25370458 SHA1: 3c93c2e775366eec6e93cf670fc8677934cb4e48 SHA256: 24f8ae73d56366453defb0654de624bd1c063921a1d7ac780e4da56bb8fbf7e4 SHA512: 9754f11aa167df167d1b336e5c660aab1bd9e12421c093e0fe96e9a2da4ffb9859b7ea5263473bbc7b57ac8b5568cf7ac3116c0abdc647e1ff97a8d060ff7eae
什么是 Ruby
Ruby 最初由 Matz (Yukihiro Matsumoto) 于 1993 年开发,现在作为开源项目开发。它在多个平台上运行,并在世界各地使用,尤其是在 Web 开发中。