Ruby 3.1.0 Preview 1 发布

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

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

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

自从 2018 年 Ruby 2.6 引入 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。目前,它也仅限于 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 字面量和关键字参数中的值。[功能 #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]]

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]
    • foo[0], bar[0] = baz, qux 在 Ruby 3.0 中按顺序 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
  • 以下默认 gem 现在是捆绑的 gem。
    • 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 开发中。