Ruby 3.3.0-preview2 发布

我们很高兴地宣布 Ruby 3.3.0-preview2 的发布。Ruby 3.3 添加了一个名为 RJIT 的新的纯 Ruby JIT 编译器,使用 Lrama 作为解析器生成器,并进行了许多性能改进,尤其是 YJIT。

RJIT

  • 引入了一个纯 Ruby JIT 编译器 RJIT 并取代了 MJIT。
    • RJIT 仅支持 Unix 平台上的 x86_64 架构。
    • 与 MJIT 不同,它在运行时不需要 C 编译器。
  • RJIT 仅用于实验目的。
    • 您应该在生产环境中使用 YJIT。
  • 如果您对开发 Ruby 的 JIT 感兴趣,请查看 k0kubun 在 RubyKaigi 第三天的演讲

使用 Lrama 代替 Bison

YJIT

  • 与 3.2 相比,性能有了重大改进
    • 改进了对 splat 和 rest 参数的支持。
    • 为虚拟机堆栈操作分配了寄存器。
    • 编译了更多带有可选参数的调用。
    • 还编译了异常处理程序。
    • 实例变量不再使用巨型对象形状退出到解释器。
    • 不支持的调用类型不再退出到解释器。
    • Integer#!=String#!=Kernel#block_given?Kernel#is_a?Kernel#instance_of?Module#=== 进行了特殊优化。
    • 现在在 optcarrot 上比解释器快 3 倍以上!
  • 编译代码的元数据使用更少的内存。
  • 在 ARM64 上生成更紧凑的代码
  • 可以选择在暂停模式下启动 YJIT,然后稍后手动启用它
    • --yjit-pauseRubyVM::YJIT.resume
    • 这可以用于仅在应用程序完成启动后才启用 YJIT
  • --yjit-stats 生成的 ratio_in_yjit 统计信息现在可以在发布版本中使用,不再需要特殊的统计或开发版本。
  • 退出跟踪选项现在支持采样
    • --trace-exits-sample-rate=N
  • 更彻底的测试和多个错误修复

其他值得注意的新特性

语言

性能改进

  • defined?(@ivar) 使用对象形状进行了优化。

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

IRB

IRB 收到了一些增强功能,包括但不限于

  • 高级 irb:rdbg 集成,提供与 pry-byebug 等效的调试体验(文档)。
  • lsshow_cmds 等命令的分页支持。
  • lsshow_source 命令提供了更准确和有用的信息。

此外,IRB 还进行了广泛的重构,并收到了数十个错误修复,以方便未来的增强。

兼容性问题

注意:不包括功能性错误修复。

删除的常量

以下已弃用的常量已删除。

删除的方法

以下已弃用的方法已删除。

Stdlib 兼容性问题

ext/readline 已停用

  • 我们有 reline,它是与 ext/readline API 兼容的纯 Ruby 实现。我们将来将依赖 reline。如果您需要使用 ext/readline,您可以通过 rubygems.org 使用 gem install readline-ext 安装 ext/readline
  • 我们不再需要安装 libreadlinelibedit 等库。

C API 更新

更新的 C API

以下 API 已更新。

删除的 C API

以下已弃用的 API 已删除。

标准库更新

如果用户需要计划在未来版本的 Ruby 中成为捆绑 gem 的 gem,RubyGems 和 Bundler 会发出警告。

以下默认 gem 已更新。

  • RubyGems 3.5.0.dev
  • bigdecimal 3.1.4
  • bundler 2.5.0.dev
  • csv 3.2.8
  • erb 4.0.3
  • fiddle 1.1.2
  • fileutils 1.7.1
  • irb 1.7.4
  • nkf 0.1.3
  • optparse 0.4.0.pre.1
  • psych 5.1.0
  • reline 0.3.8
  • stringio 3.0.9
  • strscan 3.0.7
  • syntax_suggest 1.1.0
  • time 0.2.2
  • timeout 0.4.0
  • uri 0.12.2
  • yarp 0.9.0

以下捆绑 gem 已更新。

  • minitest 5.19.0
  • test-unit 3.6.1
  • rexml 3.2.6
  • rss 0.3.0
  • net-imap 0.3.7
  • rbs 3.2.1
  • typeprof 0.21.8
  • debug 1.8.0

以下默认 gem 现在已捆绑。

  • racc 1.7.1

有关默认 gem 或捆绑 gem 的详细信息,请参阅 GitHub 版本,如 Logger 或变更日志。

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

自 Ruby 3.2.0 以来,通过这些更改,更改了 4970 个文件,插入 239635 行(+),删除 165275 行(-)

下载

  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview2.tar.gz

    SIZE: 21074209
    SHA1: cf7329019235dc36b8e3f382a8b8b744922b1163
    SHA256: 30ce8b0fe11b37b5ac088f5a5765744b935eac45bb89a9e381731533144f5991
    SHA512: 1c5a13e519e8487fd40d932b96d14fa729521925c288e7841ab5eada628e506ceca2605bae36eea1aa505d9253383d53cd933b7a4bff96e6de5b1130c7c558e6
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview2.tar.xz

    SIZE: 15600992
    SHA1: 606d6423137a24eef4f6b07d167596b63c7aaa17
    SHA256: 62b1c4f586c70bf1cb58f2d909d0d824506315782e835f9dd3fcc0b659a70fc1
    SHA512: 5ff609a66b7359006df0d87477cf70e6e26c5f40ced81b8254f8154f4fc82c77fed297471b55706c1a4466f2a4257999e933b2ed085f695ace265757ab9500a2
    
  • https://cache.ruby-lang.org/pub/ruby/3.3/ruby-3.3.0-preview2.zip

    SIZE: 26095651
    SHA1: 4441cd0db23d133e6e2f7dea28f931a68dac6ca5
    SHA256: c9771d24c9b1eab532c04ed076087285601693e4d1c63f131fd078c47c5c0cea
    SHA512: bfeed21d011f891fe22510fe7242992c98f7fd2ce863d8be5740f56a34b726134cb3f5304e8b2dcd468fbc939648f10aae482eee15c1bf6c64b705484ed9e197
    

什么是 Ruby

Ruby 最初由 Matz(松本行弘)于 1993 年开发,现在作为开源项目进行开发。它在多个平台上运行,并在世界各地广泛使用,尤其是在 Web 开发方面。