Ruby 3.2.0 正式发布
Ruby 3.2.0 现已发布,该版本添加了许多功能和性能改进。具体更新内容如下:
基于 WASI 的 WebAssembly 支持
这是基于 WASI 的 WebAssembly 支持的初始移植。此项特性使得 CRuby 二进制文件可在 Web 浏览器、Serverless Edge 环境和其他 WebAssembly/WASI 嵌入器上使用。目前,此移植可在不使用 Thread API 的前提下通过基本和引导测试套件的测试。
生产就绪的 YJIT
- YJIT 不再是实验性的
- 已经在生产工作负载上进行了一年多的测试,证明非常稳定。
- YJIT 现在支持 Linux、MacOS、BSD 和其他 UNIX 平台上的 x86-64 和 arm64/aarch64 CPU。
- 此版本支持 Apple M1/M2、AWS Graviton、Raspberry Pi 4 等。
- 构建 YJIT 现在需要 Rust 1.58.0+。[Feature #18481 ]
- 为了确保 CRuby 是使用 YJIT 构建的,请在运行
./configure
脚本之前安装rustc
>= 1.58.0 。
- 为了确保 CRuby 是使用 YJIT 构建的,请在运行
- YJIT 3.2 版本比 3.1 更快,内存开销大约是 3.1 的 1/3。
- 总体而言,YJIT 比 yjit-bench 上的 Ruby 解释器快 41%(几何平均值)。
- JIT 代码的物理内存是延迟分配的。与 Ruby 3.1 不同,Ruby 进程的 RSS 被最小化,因为
--yjit-exec-mem-size
分配的虚拟内存页在 JIT 代码实际使用之前不会映射到物理内存页。 - 引入 Code GC,当 JIT 代码的内存消耗达到
--yjit-exec-mem-size
时,释放所有代码页。 RubyVM::YJIT.runtime_stats
在现有的inline_code_size
和outlined_code_size
keys 之外,还返回 Code GC metrics:code_gc_count
、live_page_count
、freed_page_count
和freed_code_size
。
- 由
RubyVM::YJIT.runtime_stats
生成的大部分统计数据现在都可以在发布版本中使用。- 只需使用
--yjit-stats
运行 ruby 来计算和转储统计信息(会产生一些运行时开销)。
- 只需使用
- YJIT 现在经过优化以利用 object shapes。[Feature #18776 ]
- 在定义新常量时,利用更细粒度的常量失效来减少代码的无效化。[Feature #18589 ]
- 默认
--yjit-exec-mem-size
更改为 64 (MiB)。 - 默认
--yjit-call-threshold
更改为 30。
针对 ReDoS 的正则表达式改进
由于正则表达式匹配会耗费不少时间,当代码试图向不受信任的输入匹配低效的正则表达式时,攻击者可能会利用它进行 DoS 攻击(即正则表达式 DoS,或称作 ReDoS)。因此新版本引入了两项可显着缓解 ReDoS 攻击的改进。
改进的正则表达式匹配算法
从 Ruby 3.2 开始,Regexp 的匹配算法通过使用记忆技术得到了极大的改进。
# This match takes 10 sec. in Ruby 3.1, and 0.003 sec. in Ruby 3.2 /^a*b?a*$/ =~ "a" * 50000 + "x"
改进后的匹配算法使得大多数 Regexp 匹配(实验中大约为 90%)在线性时间内完成。
对于 3.2.0 预览版本的用户:此优化可能会消耗与每个匹配的输入长度成比例的内存。预计不会出现实际问题,因为此内存分配通常会延迟,并且正常的 Regexp 匹配最多应消耗 10 倍的内存输入长度。
该功能最初的提议是 https://bugs.ruby-lang.org/issues/19104
正则表达式超时退出机制
此版本引入了正则表达式超时退出机制。
Regexp.timeout = 1.0 /^a*b?a*$/ =~ "a" * 50000 + "x" #=> Regexp::TimeoutError is raised in one second
Regexp.timeout
根据 Ruby 应用程序的要求进行配置,可以防止或显着降低 DoS 的风险。请注意,Regexp.timeout
是全局配置项,如果希望对某些特殊的正则表达式使用不同的超时设置,需要使用 timeout
关键字Regexp.new
。
Regexp.timeout = 1.0 # This regexp has no timeout long_time_re = Regexp.new("^a*b?a*$", timeout: nil) long_time_re =~ "a" * 50000 + "x" # never interrupted
此项特性的最初提案:https://bugs.ruby-lang.org/issues/17837
其他值得注意的新功能
语法建议
syntax_suggest
(以前的dead_end
)的功能已集成到 Ruby 中,可以帮助找到错误的位置,例如丢失或多余的 end 。
Unmatched `end', missing keyword (`do', `def`, `if`, etc.) ? 1 class Dog > 2 defbark > 4 end 5 end
错误高亮
- 现在它指向 TypeError 和 ArgumentError 的相关参数
test.rb:2:in `+': nil can't be coerced into Integer (TypeError) sum = ary[0] + ary[1] ^^^^^^
语言
- 匿名 rest 和关键字 rest 参数可以作为参数传递,而不仅仅是在方法参数中使用。[Feature #18351]
def foo(*) bar(*) end def baz(**) quux(**) end
更多详情可查看官方公告。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Linux 6.2-rc1 已发布
Linus Torvalds 发布了 Linux 6.2 的第一个候选版本,结束了 Linux 6.2 的合并窗口,进入此发布周期的测试和错误修复阶段。 对于新的内核版本,Linus Torvalds 在6.2-rc1 公告中写道: 6.2 看起来像是一个更大的版本(肯定比 6.1 更大)。在这个合并窗口中,我们总共有大约 1800 人提交了大约 13.5k 次提交,这实际上与整个 6.1 版本的总大小相差不远。 尽管规模庞大,合并窗口后的平静期可能进度缓慢,但我们将顺利发布。 由于圣诞节假期前后启动缓慢,Linux 6.2 可能会在大约两个月后稳定下来之前进行额外一周的测试(额外的一个 RC 版本)。
- 下一篇
mica 3.0.1 已经发布,微服务框架
mica 3.0.1 已经发布,微服务框架 此版本更新内容包括: ✨ 代码优化,升级到高版本 jdk 语法 ✨ 优化 gradle 参数,开启缓存和并行处理 ✨ gradle 版本控制重构,感谢 @livk pr ⬆️ 升级到 Spring boot 3.0.1 ⬆️ 升级到 Spring cloud 2022.0.0 详情查看:https://gitee.com/596392912/mica/releases/3.0.1
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Windows10,CentOS7,CentOS8安装MongoDB4.0.16
- CentOS8安装Docker,最新的服务器搭配容器使用
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- Windows10,CentOS7,CentOS8安装Nodejs环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8编译安装MySQL8.0.19