Ruby 3.1.0 预览版 1 发布

naruse 发布于 2021年11月9日

我们很高兴地宣布 Ruby 3.1.0-preview1 发布。

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

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

Ruby 2.6 于 2018 年引入 MJIT 以来,其性能得到了极大的提升,并且最终 我们在去年实现了 Ruby3x3。但是,尽管 Optcarrot 取得了令人印象深刻的速度提升,JIT 却并未惠及实际的商业应用程序。

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

MJIT 是一个基于方法的 JIT 编译器,使用外部 C 编译器,而 YJIT 使用基本块版本化,并将 JIT 编译器包含在内部。通过懒惰基本块版本化(LBBV),它首先编译方法的一部分,并在参数和变量的类型被动态确定时逐步编译其余部分。有关详细介绍,请参阅 YJIT: a basic block versioning JIT compiler for CRuby

通过这项技术,YJIT 在大多数实际软件上实现了快速预热时间和性能改进,在 railsbench 上最高可达 22%,在 liquid-render 上最高可达 39%。

YJIT 仍然是一项实验性功能,因此默认情况下是禁用的。如果您想使用此功能,请指定 --yjit 命令行选项来启用 YJIT。目前它也仅限于 x86-64 平台的 macOS 和 Linux。

debug gem:一个新的调试器

新调试器 debug.gem 已捆绑。debug.gem 是一个快速的调试器实现,它提供了许多功能,如远程调试、彩色 REPL、IDE(VSCode)集成等。它取代了 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

此 gem 默认启用。您可以使用命令行选项 --disable-error_highlight 来禁用它。请参阅 存储库 以获取详细信息。

Irb 改进

将在下一个预览版中介绍。

其他值得注意的新特性

语言

  • Hash 字面量和关键字参数中的值可以省略。[Feature #14579]
    • {x:, y:}{x: x, y: y} 的语法糖。
    • foo(x:, y:)foo(x: x, y: y) 的语法糖。
  • 模式匹配中的 Pin 操作符现在接受一个表达式。[Feature #17411]
Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a
#=> [[3, 5], [5, 7], [11, 13]]

RBS

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

自 Ruby 3.0.0 以来的更新

  • 已引入 rbs collection 来管理 gem 的 RBS。 文档
  • 已添加/更新了许多内置和标准库的签名。
  • 它还包含许多错误修复和性能改进。

有关更多信息,请参阅 CHANGELOG.md

TypeProf

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

自 Ruby 3.0.0 以来的更新

性能改进

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

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

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

标准库更新

  • 一些标准库已更新。
    • RubyGems
    • Bundler
    • RDoc 6.4.0
    • ReLine
    • JSON 2.6.0
    • Psych 4.0.2
    • FileUtils 1.6.0
    • Fiddle
    • StringIO 3.0.1
    • IO::Console 0.5.9
    • IO::Wait 0.2.0
    • CSV
    • Etc 1.3.0
    • Date 3.2.0
    • Zlib 2.1.1
    • StringScanner
    • IpAddr
    • Logger 1.4.4
    • OStruct 0.5.0
    • Irb
    • Racc 1.6.0
    • Delegate 0.2.0
    • Benchmark 0.2.0
    • CGI 0.3.0
    • Readline(C-ext) 0.1.3
    • Timeout 0.2.0
    • YAML 0.2.0
    • URI 0.11.0
    • OpenSSL
    • DidYouMean
    • Weakref 0.1.1
    • Tempfile 0.1.2
    • TmpDir 0.1.2
    • English 0.7.1
    • Net::Protocol 0.1.2
    • Net::Http 0.2.0
    • BigDecimal
    • OptionParser 0.2.0
    • Set
    • Find 0.1.1
    • Rinda 0.1.1
    • Erb
    • NKF 0.1.1
    • Base64 0.1.1
    • OpenUri 0.2.0
    • SecureRandom 0.1.1
    • Resolv 0.2.1
    • Resolv::Replace 0.1.0
    • Time 0.2.0
    • PP 0.2.1
    • Prettyprint 0.1.1
    • Drb 2.1.0
    • Pathname 0.2.0
    • Digest 3.1.0.pre2
    • Un 0.2.0
  • 更新了以下捆绑 gem。
    • minitest 5.14.4
    • power_assert 2.0.1
    • rake 13.0.6
    • test-unit 3.5.0
    • rbs 1.6.2
    • typeprof 0.20.0
  • 以下默认 gems 现在是打包 gems。
    • net-ftp
    • net-imap
    • net-pop
    • net-smtp
    • matrix
    • prime

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

通过这些更改,自 Ruby 3.0.0 以来,已更改 2963 个文件,插入 529321 行,删除 92305 行

下载

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

    SIZE: 20821221
    SHA1: 40dfd3db076a49fab9a0eee51e89d9b3d16a4e23
    SHA256: 540f49f4c3aceb1a5d7fb0b8522a04dd96bc4a22f9660a6b59629886c8e010d4
    SHA512: 63f528f20905827d03649ed9804e4a4e5c15078f9c6c8efcfb306baa7baafa17a406eb09a2c08b42e151e14af33b1aadbd9fb1cc84f9353d070b54bbf1ff950d
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0-preview1.tar.xz

    SIZE: 15742844
    SHA1: 22aa861b17031cd1b163b7443f5f2f5897c5895e
    SHA256: 86a836ad42f6a7a469fce71ffec48fd3184af55bf79e488b568a4f64adee551d
    SHA512: bdbd7c624197ca478658280d84123a8c12ae72425bc566dcc75989c5b5ef114dd57e64efc09e2413ed615d9b47621a70ace0f3612e8ca7ba853822ad9e88c0b0
    
  • https://cache.ruby-lang.org/pub/ruby/3.1/ruby-3.1.0-preview1.zip

    SIZE: 25019629
    SHA1: ef5fa22890e55935db4b96b3089a8aea1335bd85
    SHA256: 4e8d118b2365164873148ac545a8fa36c098b846a9b19ebb9037f8ee9adb4414
    SHA512: 917803aac0848e00871614a09740b5c9cca26f200d68580dde61666633f1b7fee506e25ea4ed0c38eb20149417bf9f1ed449a4d2aec5b726de670e7177e5c07a
    

什么是 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 日

更多新闻...