Redian新闻
>
Ruby 3.2.0正式发布,新增多项改进

Ruby 3.2.0正式发布,新增多项改进

公众号新闻
出品 | OSC开源社区(ID:oschina2013)
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 。

  • 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_sizekeys 之外,还返回 Code GC metrics: code_gc_countlive_page_countfreed_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 倍的内存输入长度。
正则表达式超时退出机制
此版本引入了正则表达式超时退出机制。
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
[Feature #18159]
错误高亮
  • 现在它指向 TypeError 和 ArgumentError 的相关参数

test.rb:2:in `+': nil can't be coerced into Integer (TypeError)

sum = ary[0] + ary[1]
^^^^^^
语言
  • 匿名 rest 和关键字 rest 参数可以作为参数传递,而不仅仅是在方法参数中使用。[Feature #18351]

  deffoo(*)
bar(*)
end
defbaz(**)
quux(**)
end
更多详情可查看官方公告:https://www.ruby-lang.org/en/news/2022/12/25/ruby-3-2-0-released/


END



开源白嫖不提倡?



这里有最新开源资讯、软件更新、技术干货等内容

点这里 ↓↓↓ 记得 关注✔ 标星⭐ 哦~

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
【我的莱】茄子怎么做不吃油——暴力茄子基于NT架构脱胎换骨!QQ for Linux 3.0正式版上架官网Go 1.20正式发布,最后一个支持Win7、Win8等旧系统的版本一加11再预热,新机明天正式发布,影像、性能升级重磅!驻美使馆正式发布,这样可免费获回国签证...1699元起,realme真我10 Pro+正式发布,一亿像素曲面屏手机秋风顶配13199元!三星Galaxy S23 正式发布,第二代骁龙8升级版加持Spring Cloud 2022.0.0 正式发布,代号 "Kilburn"Kubernetes 1.26 版本正式发布:改进 Windows 支持,加强网络安全和管理功能证监会宣布:这项改革12月26日正式实施再见了,“蓝胖子”!南航A380正式退役,国内再无“空中巨无霸”iBUILDING数字孪生中台正式发布,可视化管理加速智慧建筑发展Kotlin 1.8.0发布,改进性能和Swift的互操作性Rust 1.65.0稳定版发布,泛型关联类型(GATs)正式稳定Nacos 2.2 正式发布,新特性真香啊!Manticore Search 6正式发布,C++高性能搜索引擎SpringBoot 3.0正式发布,有这几个新变化!3999元起,一加 11 正式发布,定位未来性能引领者Nacos 2.2 正式发布,看看都有什么新特性?《死亡谷》名字吓人,景色动人心魄新雅阁发布!第11代雅阁正式发布,使用新家族化设计开放麒麟 openKylin 0.9.5 版本发布,全面改进Vant 4.0正式发布,基于Vue 3的移动组件库一加 Ace 2 正式发布,2799元起【体育内参】《体育仲裁规则》正式发布,2023年1月1日起施行《2022杭州直播电商产业发展白皮书》正式发布,洞察未来发展趋势Knife4j 4.0正式发布,新征程!!!新增多个法定假日等加州多项新法1月1日上路Linux 6.1正式发布,带有MGLRU、初始Rust支持新 Apple Pencil 发布前被取消/马斯克:推特若下架,自己造手机/微信新增多项实用功能SvelteKit 1.0正式发布十月的两件事和一个提醒重磅!驻美使馆正式发布,十年回国签证要如何恢复?这样可免费获签证...雨夹雪中的小思想
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。