由 naruse 发布于 2021 年 11 月 9 日
我们很高兴地宣布 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。
- 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 是一个快速的调试器实现,它提供了许多功能,如远程调试、彩色 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 以来的更新
- 已经实现了实验性 IDE 支持。
- 许多错误修复和性能改进。
性能改进
- 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]
标准库更新
- 更新了一些标准库。
- 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
通过这些更改,自 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 开发中。