Ruby 3.3.0 正式发布


Ruby 3.3.0 现已正式发布。新版本添加了一个名为 Prism 的新解析器,使用 Lrama 作为解析器生成器,添加了一个名为 RJIT 的新纯 Ruby JIT 编译器,以及许多性能改进,尤其是 YJIT。

具体更新内容如下:

Prism

  • 引入 Prism 解析器作为默认 gem
    • Prism 是一个可移植、容错且可维护的 Ruby 语言递归下降解析器
  • Prism 已做好生产准备并积极维护,用户可以使用它代替 Ripper
    • 具体介绍可查看 Prism 的文档。
    • Prism 既是一个由 CRuby 内部使用的 C 库,又是一个可供任何需要解析 Ruby 代码的工具使用的 Ruby gem
    • Prism API 中值得注意的方法有:
      • Prism.parse(source)返回 AST 作为解析结果对象的一部分
      • Prism.parse_comments(source)返回 comments
      • Prism.parse_success?(source)如果没有错误,则返回 true
  • 现在可以使用ruby --parser=prismRUBYOPT="--parser=prism"尝试使用  Prism 编译器。值得注意的是,该 flag 仅用于调试。

使用 Lrama 代替 Bison

  • 用 Lrama LALR 解析器生成器替换 Bison [Feature #19637]
    • 更多详情可参阅Ruby Parser 的未来愿景
    • 为了便于维护,Lrama 内部解析器被替换为 Racc 生成的 LR 解析器
    • 支持参数化规则(?, *, +),将在 Ruby parse.y 中使用

YJIT

  • 相对 Ruby 3.2 的主要性能改进
    • 对 splat 和 rest 参数的支持已得到改进。
    • 为虚拟机的堆栈操作分配了寄存器。
    • 编译更多带有可选参数的调用。异常处理程序也被编译。
    • 不支持的调用类型和复态调用点不再退出到解释器。
    • Rails #blank?和specialized#present?等基本方法都是内联的。
    • Integer#*Integer#!=String#!=String#getbyte、 Kernel#block_given?Kernel#is_a?Kernel#instance_of?Module#===进行了特别优化。
    • 编译速度现在比 Ruby 3.2 稍快。
    • 现在比 Optcarrot 上的解释器快 3 倍以上
  • 与 Ruby 3.2 相比显着提高了内存使用率
    • 编译代码的元数据占用内存更少。
    • 当应用程序的 ISEQ 超过 40,000 个时,--yjit-call-threshold会自动从 30 提高到 120。
    • 添加--yjit-cold-threshold以跳过编译 cold ISEQ。
    • 在 Arm64 上生成更紧凑的代码。
  • Code GC 现在默认禁用
    • --yjit-exec-mem-size被视为新代码编译停止的硬限制。
    • 不会因 Code GC 导致性能突然下降。使用 Pitchfork 重新分叉的服务器上有更好的 copy-on-write 行为 。
    • 如果需要,仍然可以使用--yjit-code-gc启用 code GC
  • 添加RubyVM::YJIT.enable以便在运行时启用 YJIT
    • 无需修改​​命令行参数或环境变量即可启动 YJIT。Rails 7.2 将使用此方法默认启用 YJIT 。
    • 这也可用于仅在应用程序完成启动后启用 YJIT。如果想在启动时禁用 YJIT 的同时使用其他 YJIT 选项,可以使用--yjit-disable
  • 默认情况下提供更多 YJIT stats
    • 现在默认情况下还提供了yjit_alloc_size和更多与元数据相关的统计信息。
    • --yjit-stats生成的 ratio_in_yjitstat 现在可在发行版中使用,不再需要特殊的 stats 或 dev 版本才能访问大多数统计信息。
  • 添加更多 profiling 功能
    • 添加--yjit-perf以方便使用 Linux perf 进行分析。
    • --yjit-trace-exits现在支持使用--yjit-trace-exits-sample-rate=N进行采样
  • 更全面的测试和多个错误修复

RJIT

  • 引入了纯 Ruby JIT 编译器 RJIT 并取代了 MJIT。
    • RJIT 仅支持 Unix 平台上的 x86-64 架构。
    • 与 MJIT 不同,它在运行时不需要 C 编译器。
  • RJIT 的存在仅用于实验目的。
    • 建议用户在生产环境中继续使用 YJIT。
  • 如果对为开发 JIT for Ruby 感兴趣,可查看 k0kubun 在 RubyKaigi 第 3 天的演示。

M:N 线程调度器

  • 引入了 M:N 线程调度程序。[Feature#19842]
    • M 个 Ruby 线程由 N 个本机线程(操作系统线程)管理,因此减少了线程创建和管理成本。
    • 它可能会破坏 C 扩展兼容性,因此默认情况下会在主 Ractor 上禁用 M:N 线程调度程序。
      • RUBY_MN_THREADS=1环境变量可在主 Ractor 上启用 M:N 线程。
      • M:N 线程始终在非主 Ractor 上启用。
    • RUBY_MAX_CPU=n环境变量用于设置N(本地线程的最大数量)的最大值。默认值为 8。
      • 由于每个 Ractor 只能同时运行一个 Ruby 线程,因此将使用的本地线程数是RUBY_MAX_CPU中指定的线程数和正在运行的 Ractor 数量中较小的一个。因此,单 Ractor 应用程序(大多数应用程序)将只使用 1 个本地线程。
      • 为了支持阻塞操作,可以使用N个以上的本地线程。

更多详情可查看官方公告。


相關推薦

2023-05-15

Ruby 3.3.0-preview1 已发布,作为 3.3 的第一个预览版。Ruby 3.3 最重大的改动是添加了一个名为 RJIT 的新纯 Ruby JIT 编译器,使用 Lrama 作为解析器生成器,并带来许多性能改进。 RJIT Ruby 3.3.0-preview1 引入纯 Ruby JIT 编译器 RJIT 替换了 MJI

2022-11-25

Ruby 3.1.3、3.0.5、2.1.7 发布了,这几个版本都只包含一个安全修复程序,修复了同一个漏洞: CVE-2021-33621:CGI 中的 HTTP 响应拆分 如果应用程序使用带有不受信任的用户输入的 cgi gem 生成 HTTP 响应,则攻击者可以利用它来注入

2022-12-26

Ruby 3.2.0 现已发布,该版本添加了许多功能和性能改进。具体更新内容如下: 基于 WASI 的 WebAssembly 支持 这是基于 WASI 的 WebAssembly 支持的初始移植。此项特性使得 CRuby 二进制文件可在 Web 浏览器、Serverless Edge 环境和其他 WebAssem

2023-02-04

Ronin 2.0.0 已正式发布。 Ronin 是用于安全研究和开发的 Ruby 工具包,它包含许多不同的 CLI 命令和 Ruby 库,适用于各种安全场景,例如编码 / 解码数据、过滤 IP / 主机 / URL、查询 ASN、查询 DNS、HTTP、扫描 Web 漏洞、爬取网站、安装

2022-11-21

在今年 6 月,GitHub 就宣布将会停用 Atom。 近日 Atom 1.63 正式发布,这也是 Atom 的最后一次版本更新,在 2022 年 12 月 15 日,GitHub 会将 Atom 和 Atom 组织下的所有仓库全部归档。 Atom 1.63 更新内容如下: Atom Core atom/atom#23158 - 删

2022-11-24

经过三年多的努力,Hanami 2.0 正式发布,随着这个版本的发布,Hanami 进入了框架成熟的新阶段,并为 Ruby 社区开启了新的篇章。 更好 Hanami 2.0 的核心是现在的 app/ 目录,在这里,你可以随心所欲地组织你的代码,同时还可以享

2022-11-16

Rails 基金会宣布正式成立,使命在于改善生态系统中的文档、教育、营销和活动,以使所有新的和现有的 Rails 开发者受益。该基金会由一些与 Rails 紧密相关的公司发起。按首字母排序,八个创始核心成员分别是:Cookpad、Doximity

2023-01-13

类方法,且同时适用于桌面和移动终端。 Discourse 3.0 已正式发布,此版本带来了实时聊天和用户状态、可定制的侧边栏,以及一个新的通知界面,此外还有大量改进。 新的设置向导 添加了一个新的设置向导,通过简单的切换

2023-10-21

系统调用。 目前,Ruvy并未随预编译的二进制文件一起发布,因此需要安装它的构建依赖项,然后编译Ruvy才能使用。 安装这些依赖项的详细信息请查看README。 构建Ruvy后,可以运行以下命令来打印出 Hello World。 $ cargo run -- p

2023-04-01

Ruby 3.2.2 现已发布,具体更新内容包括: 为 Ruby 3.2 反向移植 [Bug #19158] by hsbt · Pull Request#7356 错误 #19415:并发要求的不正确循环警告 错误 #19400:YJIT 无法在 64 KiB 页面的 ARM64 系统上启动 错误 #19419:[BUG] 尝试在ibf_dump_mark

2022-12-08

Ruby 3.2.0 RC 1 发布了,3.2.0 预览版引入基于 WASI 的 WebAssembly 支持和正则表达式超时退出机制,3.2.0 RC 1 则引入两项可显著缓解 ReDoS 攻击的改进,以及一些语言功能和性能改进。 改进的正则表达式匹配算法 从 Ruby 3.2 开始,Regexp

2023-03-11

Ruby 代码仓库近期新增了一个关于合并 RJIT 的 PR。 据介绍,RJIT 是新的 JIT 编译器,用作 MJIT 的替代实现。主要特性如下: RJIT 使用纯 Ruby 汇编程序生成原生代码 MJIT 在运行时需要 C 编译器,YJIT 在构建时需要 Rust 编

2022-04-21

去年 12 月,Ruby JIT 团队的成员提出,希望将 YJIT 代码库从 C99 移植到 Rust。虽然有不少开发者对此持保留意见,但这个项目最终得到了 Ruby 核心开发者以及创始人 Matz 的批准。 昨日,负责此项目的开发者表示已完成了使用 Rust

2023-01-19

发,让开发者以最佳实践创建新项目并与平台整合,或是发布生产构件供店家使用。不过 Shopify CLI 开发团队发现,对构建 Shopify 应用程序的开发者来说,他们在使用 CLI 上一直存在部分体验问题,因此决定重新审视 CLI 的开发语