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。
- https://bugs.ruby-lang.org/issues/18229
- https://shopifyengineering.com/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 字面量和关键字参数中的值可以省略。[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 以来的更新
- 已实现 实验性 IDE 支持。
- 许多错误修复和性能改进。
性能改进
- MJIT
- 对于像 Rails 这样的工作负载,默认的
--jit-max-cache已从 100 更改为 10000。JIT 编译器不再跳过编译长度超过 1000 条指令的方法。 - 为了支持 Rails 的 Zeitwerk,当启用了类事件的 TracePoint 时,JIT 代码不再被取消。
- 对于像 Rails 这样的工作负载,默认的
自 3.0 以来的其他值得注意的更改
- 单行模式匹配,例如
ary => [x, y, z],不再是实验性的。 - 多个赋值的求值顺序略有改变。[Bug #4443]
- 在 Ruby 3.0 中,
foo[0], bar[0] = baz, qux的求值顺序是baz、qux、foo,然后是bar。在 Ruby 3.1 中,它的求值顺序是foo、bar、baz,然后是qux。
- 在 Ruby 3.0 中,
- 可变宽度分配:字符串(实验性)[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
通过这些更改,自 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 日