Ruby 3.1.0 发布

我们很高兴地宣布 Ruby 3.1.0 的发布。Ruby 3.1 保持了与 Ruby 3.0 的兼容性,并添加了许多功能。

YJIT:新的实验性进程内 JIT 编译器

Ruby 3.1 合并了 YJIT,这是一个由 Shopify 开发的新的进程内 JIT 编译器。

自从 Ruby 2.6 在 2018 年引入 MJIT 以来,其性能得到了极大的提高,并且最终 我们在去年实现了 Ruby3x3。但即使 Optcarrot 基准测试显示了令人印象深刻的加速,JIT 也没有使现实世界的商业应用程序受益。

最近,Shopify 贡献了许多 Ruby 改进,以加速他们的 Rails 应用程序。YJIT 是一项重要的贡献,旨在提高 Rails 应用程序的性能。

MJIT 是一个基于方法的 JIT 编译器,并使用外部 C 编译器,而 YJIT 使用基本块版本控制,并在其中包含一个 JIT 编译器。通过延迟基本块版本控制(LBBV),它首先编译一个方法的开头,并在动态确定参数和变量的类型时逐步编译其余部分。有关详细介绍,请参阅 YJIT:CRuby 的基本块版本控制 JIT 编译器

借助这项技术,YJIT 在大多数现实世界的软件上实现了快速预热时间和性能提升,在 railsbench 上提升高达 22%,在 liquid-render 上提升高达 39%。

YJIT 仍然是一个实验性功能,因此默认情况下处于禁用状态。如果要使用它,请指定 --yjit 命令行选项以启用 YJIT。它目前也仅限于类 Unix 的 x86-64 平台。

debug gem:新的调试器

捆绑了一个完全重写的调试器 debug.gem。debug.gem 具有以下功能

  • 提高调试性能(即使使用调试器也不会减慢应用程序的速度)。
  • 支持远程调试。
  • 支持丰富的调试前端(目前支持 VS Code 和 Chrome 浏览器)。
  • 支持多进程/多线程调试。
  • 彩色 REPL。
  • 以及其他有用的功能,如记录和重放功能、跟踪功能等。

Ruby 曾捆绑 lib/debug.rb,但它没有得到很好的维护,并且存在关于性能和功能的问题。debug.gem 完全取代了 lib/debug.rb。

error_highlight:回溯中细粒度的错误位置

引入了一个内置 gem,error_highlight。它在回溯中包含细粒度的错误位置

$ ruby test.rb
test.rb:1:in `<main>': undefined method `time' for 1:Integer (NoMethodError)

1.time {}
 ^^^^^
Did you mean?  times

目前,仅支持 NameError

默认情况下启用此 gem。您可以使用命令行选项 --disable-error_highlight 禁用它。有关详细信息,请参阅 error_highlight 存储库

IRB 自动完成和文档显示

IRB 现在具有自动完成功能,您只需键入代码,就会出现完成候选项对话框。您可以使用 Tab 和 Shift+Tab 上下移动。

如果在选择完成候选项时安装了文档,则文档对话框将出现在完成候选项对话框旁边,显示部分内容。您可以按 Alt+d 阅读完整文档。

其他值得注意的新功能

语言

  • 可以省略哈希字面量和关键字参数中的值。 [功能 #14579]
    • {x:, y:}{x: x, y: y} 的语法糖。
    • foo(x:, y:)foo(x: x, y: y) 的语法糖。
  • 模式匹配中的 pin 运算符 (^) 现在接受表达式。 [功能 #17411]

    Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a
    #=> [[3, 5], [5, 7], [11, 13]]
    
  • 在一行模式匹配中可以省略括号。 [功能 #16182]

    [0, 1] => _, x
    {y: 2} => y:
    x #=> 1
    y #=> 2
    

RBS

RBS 是一种描述 Ruby 程序结构的语言。有关详细信息,请参阅 RBS 存储库

自 Ruby 3.0.0 以来的更新

  • 泛型类型参数可以被限制。(PR)
  • 支持泛型类型别名。(PR)
  • 引入了 rbs collection 来管理 gem 的 RBS。(文档)
  • 为内置和标准库添加/更新了许多签名。
  • 它还包括许多错误修复和性能改进。

有关更多信息,请参阅 RBS 变更日志

TypeProf

TypeProf 是 Ruby 的静态类型分析器。它从非类型注释的 Ruby 代码生成 RBS 的原型。有关详细信息,请参阅文档

自 Ruby 3.0.0 以来的主要更新是名为 “TypeProf for IDE” 的实验性 IDE 支持。

Demo of TypeProf for IDE

VS Code 扩展在每个方法定义上方显示一个猜测的(或在 RBS 文件中显式编写的)方法签名,在可能导致名称错误或类型错误的代码下方绘制红色下划线,并完成方法名称(即,显示方法候选项)。有关详细信息,请参阅文档

此外,该版本还包括许多错误修复和性能改进。

性能改进

  • MJIT
    • 对于像 Rails 这样的工作负载,默认的 --jit-max-cache 从 100 更改为 10000。JIT 编译器不再跳过编译长度超过 1000 条指令的方法。
    • 为了支持 Rails 的 Zeitwerk,当启用类事件的 TracePoint 时,不再取消 JIT 编译的代码。

自 3.0 以来的其他值得注意的更改

  • 单行模式匹配,例如 ary => [x, y, z],不再是实验性的。
  • 多重赋值的求值顺序略有变化。[Bug #4443]
    • foo[0], bar[0] = baz, qux 在 Ruby 3.0 中按顺序 bazquxfoobar 进行求值。在 Ruby 3.1 中,它按顺序 foobarbazqux 进行求值。
  • 可变宽度分配:字符串(实验性)。[Bug #18239]

  • Psych 4.0 将 Psych.load 更改为默认使用 safe_load。您可能需要使用 Psych 3.3.2 迁移到此行为。[Bug #17866]

标准库更新

  • 以下默认 gem 已更新。
    • RubyGems 3.3.3
    • base64 0.1.1
    • benchmark 0.2.0
    • bigdecimal 3.1.1
    • bundler 2.3.3
    • cgi 0.3.1
    • csv 3.2.2
    • date 3.2.2
    • did_you_mean 1.6.1
    • digest 3.1.0
    • drb 2.1.0
    • erb 2.2.3
    • error_highlight 0.3.0
    • etc 1.3.0
    • fcntl 1.0.1
    • fiddle 1.1.0
    • fileutils 1.6.0
    • find 0.1.1
    • io-console 0.5.10
    • io-wait 0.2.1
    • ipaddr 1.2.3
    • irb 1.4.1
    • json 2.6.1
    • logger 1.5.0
    • net-http 0.2.0
    • net-protocol 0.1.2
    • nkf 0.1.1
    • open-uri 0.2.0
    • openssl 3.0.0
    • optparse 0.2.0
    • ostruct 0.5.2
    • pathname 0.2.0
    • pp 0.3.0
    • prettyprint 0.1.1
    • psych 4.0.3
    • racc 1.6.0
    • rdoc 6.4.0
    • readline 0.0.3
    • readline-ext 0.1.4
    • reline 0.3.0
    • resolv 0.2.1
    • rinda 0.1.1
    • ruby2_keywords 0.0.5
    • securerandom 0.1.1
    • set 1.0.2
    • stringio 3.0.1
    • strscan 3.0.1
    • tempfile 0.1.2
    • time 0.2.0
    • timeout 0.2.0
    • tmpdir 0.1.2
    • un 0.2.0
    • uri 0.11.0
    • yaml 0.2.0
    • zlib 2.1.1
  • 以下捆绑的 gem 已更新。
    • minitest 5.15.0
    • power_assert 2.0.1
    • rake 13.0.6
    • test-unit 3.5.3
    • rexml 3.2.5
    • rbs 2.0.0
    • typeprof 0.21.1
  • 以下默认 gem 现在是捆绑的 gem。您需要在 bundler 环境下将以下库添加到 Gemfile 中。
    • net-ftp 0.1.3
    • net-imap 0.2.2
    • net-pop 0.1.1
    • net-smtp 0.3.1
    • matrix 0.4.2
    • prime 0.1.2
    • debug 1.4.0

有关更多详细信息,请参阅 NEWS提交日志

自 Ruby 3.0.0 以来,进行了这些更改后,更改了 3124 个文件,插入了 551760 行(+),删除了 99167 行(-)

圣诞快乐,节日快乐,尽情享受使用 Ruby 3.1 编程的乐趣!

下载

  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.gz

    SIZE: 20103517
    SHA1: e4e8c20dd2a1fdef4d3e5bd5a3461000dd17f226
    SHA256: 50a0504c6edcb4d61ce6b8cfdbddaa95707195fab0ecd7b5e92654b2a9412854
    SHA512: 76009d325e961e601d9a287e36490cbc1f3b5dbf4878fa6eab2c4daa5ff2fed78cbc7525cd87b09828f97cbe2beb30f528928bcc5647af745d03dffe7c5baaa9
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.tar.xz

    SIZE: 14709096
    SHA1: 92b603c2a69fb25d66c337a63e94280984edea11
    SHA256: 1a0e0b69b9b062b6299ff1f6c6d77b66aff3995f63d1d8b8771e7a113ec472e2
    SHA512: a2bb6b5e62d5fa06dd9c30cf84ddcb2c27cb87fbaaffd2309a44391a6b110e1dde6b7b0d8c659b56387ee3c9b4264003f3532d5a374123a7c187ebba9293f320
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0.zip

    SIZE: 24388179
    SHA1: e37435956d6f840a0e8758d7374bc7e0e346105f
    SHA256: a3bfcd486d09c065d46421da0ff3d430ce4423fefd80cea63c6595d83ae4af0e
    SHA512: 67db71144e06da2c1c25eaf413d1417c99a4b18738a573f9e3371c11ea242eee9dcbdc3de17336f25ab5060039fe034e57298943d344be9cd9eb33bb56e2e1c6
    

什么是 Ruby

Ruby 最初由 Matz (Yukihiro Matsumoto) 于 1993 年开发,现在作为开源软件进行开发。它在多个平台上运行,并在世界各地被广泛使用,尤其是在 Web 开发领域。