Ruby 3.2.0 Preview 1 已发布

我们很高兴地宣布 Ruby 3.2.0-preview1 已发布。Ruby 3.2 增加了很多新功能和性能改进。

基于 WASI 的 WebAssembly 支持

这是首次基于 WASI 的 WebAssembly 支持。使得 CRuby 二进制内容可用于浏览器、Serverless Edge、以及其他 WebAssebly/WASI 嵌入环境。目前,此功能已通过除 Thread API 之外的 basic 和 bootstrap 测试套件。

背景

WebAssembly (Wasm) 希望能够在浏览器中提供安全快速的运行程序的方式。但其目标,也就是在不同环境中安全高效的运行程序,不仅是 web 应用长期以来的目标,也是其他一般程序所需要的。

WASI (The WebAssembly System Interface) 被设计用于此类应用场景。尽管此类应用需要与操作系统进行通信,WebAssembly 却运行在一个没有系统接口的虚拟机之上。WASI 使之标准化。

Ruby 的 WebAssembly/WASI 支持,希望利用这些项目,使 Ruby 开发者可以编写能运行于兼容此类功能的平台上。

应用场景

这种支持鼓励开发人员可以在 WebAssembly 环境中使用 CRuby。一个此类应用场景的案例是 TryRuby playground 的 CRuby 支持。现在您可以在您的浏览器中尝试原生的 CRuby。

技术要点

目前,WASI 和 WebAssembly 仍在不断演进,同时基于安全原因,还缺少一些功能来实现纤程、异常和垃圾回收。 所以,CRuby 使用了一种可以控制用户空间中执行的二进制转换技术 Asyncify 来填补这一鸿沟。

此外,我们创建了 WASI 之上的虚拟文件系统,于是就可以很容易地将 Ruby 应用打包成单个 .wasm 文件,进而简化分发 Ruby 应用的过程。

相关链接

Regexp 超时设置

新增正则表达式匹配的超时设置。

Regexp.timeout = 1.0

/^a*b?a*$/ =~ "a" * 50000 + "x" #=> 1秒后 Regexp::TimeoutError

众所周知,正则表达式匹配的耗时长度可能出乎意料之外。如果您的代码尝试从一个不可信输入中匹配一个低效的正则表达式,攻击者可以借此发起有效的拒绝服务攻击(所谓的正则表达式 DoS,或 ReDoS)。

根据您的 Ruby 程序的需要,可以通过设置 Regexp.timeout 来避免或减轻这种 DoS 风险。请在您的程序中进行尝试,我们欢迎您的反馈。

请注意,Regexp.timeout 是全局性的配置。如果您希望对于某些特殊的正则表达式使用不同的超时设置,您可以使用 Regexp.new 中的 timeout 关键词。

Regexp.timeout = 1.0

# 这个 Regexp 没有超时设置
long_time_re = Regexp.new("^a*b?a*$", timeout: nil)

long_time_re =~ "a" * 50000 + "x" # 不会被中断

最初提议: https://bugs.ruby-lang.org/issues/17837

其他值得注意的新功能

不再捆绑第三方源代码

  • 我们不再捆绑第三方源代码,例如 libyamllibffi

    • psych 中已经移除了 libyaml 的代码。您可能需要在 Ubuntu/Debian 平台中安装 libyaml-dev。软件包的名称可能因平台不同而各异。

    • 在 preview2 中,fiddle 将移除 libffi。

语言

  • 查找模式不再是实验性功能。

性能改进

自 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 至 Version 14.0.0,Emoji Version 14.0. [[Feature #18037]] (同样适用于 Regexp)
    • 新增 String#bytesplice 。 [[Feature #18598]]
  • Struct
    • 即使在 Struct.new 中不设置 keyword_init: true,Struct 类也可以通过关键词参数进行初始化。 [[Feature #16806]]

标准库更新

  • 下列默认 gems 被更新。

    • 待定
  • 下列 bundled gems 被更新。

    • 待定
  • 下列默认 gems 现在是 bundled gems。您需要在 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开发领域。