由 naruse 发布于 2021 年 12 月 25 日
我们很高兴地宣布 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 平台。
- https://bugs.ruby-lang.org/issues/18229
- https://shopify.engineering/yjit-just-in-time-compiler-cruby
- https://www.youtube.com/watch?v=PBVLf3yfMs8
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 支持。
VS Code 扩展在每个方法定义上方显示一个猜测的(或在 RBS 文件中显式编写的)方法签名,在可能导致名称错误或类型错误的代码下方绘制红色下划线,并完成方法名称(即,显示方法候选项)。有关详细信息,请参阅文档。
此外,该版本还包括许多错误修复和性能改进。
性能改进
- MJIT
- 对于像 Rails 这样的工作负载,默认的
--jit-max-cache
从 100 更改为 10000。JIT 编译器不再跳过编译长度超过 1000 条指令的方法。 - 为了支持 Rails 的 Zeitwerk,当启用类事件的 TracePoint 时,不再取消 JIT 编译的代码。
- 对于像 Rails 这样的工作负载,默认的
自 3.0 以来的其他值得注意的更改
- 单行模式匹配,例如
ary => [x, y, z]
,不再是实验性的。 - 多重赋值的求值顺序略有变化。[Bug #4443]
foo[0], bar[0] = baz, qux
在 Ruby 3.0 中按顺序baz
、qux
、foo
和bar
进行求值。在 Ruby 3.1 中,它按顺序foo
、bar
、baz
和qux
进行求值。
-
可变宽度分配:字符串(实验性)。[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
自 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 开发领域。