Ruby 3.2.0 Preview 1 发布

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 playground 对 CRuby 的支持。现在您可以在浏览器中尝试原始 CRuby 了。

技术要点

今天的 WASI 和 WebAssembly 本身在实现 Fiber、异常和 GC 方面存在一些缺失的功能,因为它们仍在发展中,也出于安全原因。因此,CRuby 通过使用 Asyncify 来弥补这一差距,Asyncify 是一种用于控制用户空间执行的二进制转换技术。

此外,我们在 WASI 之上构建了 一个 VFS,以便我们可以轻松地将 Ruby 应用打包成单个 .wasm 文件。这使得 Ruby 应用的分发更加容易。

Regexp 超时

为 Regexp 匹配引入了超时功能。

Regexp.timeout = 1.0

/^a*b?a*$/ =~ "a" * 50000 + "x"
#=> Regexp::TimeoutError is raised in one second

众所周知,Regexp 匹配可能需要意想不到的长的时间。如果您的代码尝试将一个可能效率低下的 Regexp 与不可信的输入进行匹配,攻击者可能会利用它进行高效的拒绝服务攻击(所谓的正则表达式 DoS,或 ReDoS)。

可以通过根据您的 Ruby 应用程序的要求配置 Regexp.timeout 来防止或显著减轻 DoS 风险。请在您的应用程序中试用,我们欢迎您的反馈。

请注意,Regexp.timeout 是全局配置。如果您想为一些特殊的 Regexps 使用不同的超时设置,您可能想在 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
    • 现在,如果 Hash 为空,Hash#shift 始终返回 nil,而不是返回默认值或调用默认 proc。[[Bug #16908]]
  • MatchData
    • 已添加 MatchData#byteoffset。[[Feature #13110]]
  • Module
    • 已添加 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
    • Set 现在是内置类,无需 require "set"。[[Feature #16989]] 它目前通过 Set 常量或调用 Enumerable#to_set 进行自动加载。
  • String
    • 已添加 String#byteindex 和 String#byterindex。[[Feature #13110]]
    • Unicode 更新至 14.0.0 版本,Emoji 更新至 14.0 版本。[[Feature #18037]] (也适用于 Regexp)
    • 已添加 String#bytesplice。[[Feature #18598]]
  • Struct
    • Struct 类也可以使用关键字参数进行初始化,而无需在 Struct.new 上设置 keyword_init: true [[Feature #16806]]

标准库更新

  • 以下默认 gem 已更新。

    • 待定
  • 更新了以下捆绑 gem。

    • 待定
  • 以下默认 gem 现在是捆绑 gem。您需要在 bundler 环境下的 Gemfile 中添加以下库。

    • 待定

有关更多详细信息,请参阅 NEWScommit logs

与 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 开发领域。

近期新闻

Ruby 4.0.0 发布

我们很高兴地宣布 Ruby 4.0.0 的发布。Ruby 4.0 引入了“Ruby Box”和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 25 日

Ruby 文档的全新外观

继 ruby-lang.org 重新设计之后,我们还有更多好消息来庆祝 Ruby 成立 30 周年:docs.ruby-lang.org 采用了 Aliki——RDoc 的新默认主题,焕然一新。

Stan Lo 发布于 2025 年 12 月 23 日

重新设计我们的网站标识

我们很高兴地宣布对我们的网站进行全面重新设计。此次更新的设计由 Akatsuka Taeko 创作。

Hiroshi SHIBATA 发布于 2025 年 12 月 22 日

Ruby 4.0.0 preview3 发布

我们很高兴地宣布 Ruby 4.0.0-preview3 的发布。Ruby 4.0 引入了 Ruby::Box 和“ZJIT”,并增加了许多改进。

naruse 发布于 2025 年 12 月 18 日

更多新闻...