您现在的位置是:首页 > 文章详情

Ruby 3.1.0 发布

日期:2021-12-25点击:664

我们很高兴地宣布 Ruby 3.1.0 的发布。Ruby 3.1 保持与 Ruby 3.0 的兼容性,并添加了许多功能。

YJIT:新的实验性进程内 JIT 编译器

Ruby 3.1 合并了 YJIT,这是 Shopify 开发的一种新的进程内 JIT 编译器。

自从2018Ruby 2.6 引入了 MJIT 后,它的性能有了很大的提升,最终我们在去年实现了 Ruby3x3。但是,尽管 Optcarrot 已经显示出令人印象深刻的加速,但 JIT 并没有使现实世界的业务应用程序受益。

最近 Shopify 贡献了许多 Ruby 改进来加速他们的 Rails 应用程序。YJIT 是一个重要的贡献,旨在提高 Rails 应用程序的性能。

尽管 MJIT 是基于方法的 JIT 编译器并使用外部 C 编译器,但 YJIT 使用基本块版本控制并在其中包含 JIT 编译器。使用 Lazy Basic Block Versioning (LBBV),它首先编译方法的开头,并在动态确定参数和变量的类型时增量编译其余部分。有关详细介绍,请参阅YJIT:用于 CRuby 的基本块版本控制 JIT 编译器

通过这项技术,YJIT 在大多数现实世界的软件上实现了快速预热时间和性能改进,在 railsbench 上高达 22%,在液体渲染上高达 39%。

YJIT 仍然是一个实验性功能,因此默认情况下它是禁用的。如果要使用它,请指定--yjit命令行选项以启用 YJIT。目前它也仅限于类 Unix 的 x86-64 平台。

  • https://bugs.ruby-lang.org/issues/18229
  • https://shopify.engineering/yjit-just-in-time-compiler-cruby
  • https://www.youtube.com/watch?v=PBVLf3yfMs8

debug gem:一个新的调试器

捆绑了一个完全重写的调试器debug.gem。debug.gem 有以下特点:

  • 提高调试性能(即使使用调试器也不会减慢应用程序的速度)
  • 支持远程调试
  • 支持丰富的调试前端(现在支持VSCode和Chrome浏览器)
  • 支持多进程/多线程调试
  • 多彩的REPL
  • 以及其他有用的功能,如记录和重放功能、跟踪功能等。

 

 

Ruby 捆绑了 lib/debug.rb,但它没有得到很好的维护,并且在性能和特性方面存在问题。debug.gem 完全取代了 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 

目前,仅NameError支持。

默认情况下启用此 gem。您可以使用命令行选项禁用它--disable-error_highlight。详细查看存储库

IRB 自动完成和文档显示

IRB 现在具有自动完成功能,您只需在其中输入代码,就会出现完成候选对话框。您可以使用 Tab 和 Shift+Tab 上下移动。

如果在选择完成候选时安装了文档,则完成候选对话框旁边将出现文档对话框,显示部分内容。您可以按 Alt+d 阅读完整文档。

 

 

其他值得注意的新功能

语法改进

  • 哈希文字和关键字参数中的值可以省略。[功能#14579]
    • {x:, y:}是 的语法糖{x: x, y: y}
    • foo(x:, y:)是 的语法糖foo(x: x, y: y)
  • 模式匹配中的 Pin 运算符现在采用表达式。[功能#17411]
 Prime.each_cons(2).lazy.find_all{_1 in [n, ^(n + 2)]}.take(3).to_a #=> [[3, 5], [5, 7], [11, 13]] 
  • 单行模式匹配中可以省略括号。[功能#16182]
 [0, 1] => _, x {y: 2} => y: x #=> 1 y #=> 2 

RBS

RBS 是一种描述 Ruby 程序结构的语言。有关详细信息,请参阅存储库

自 Ruby 3.0.0 以来的更新:

  • 泛型类型参数可以是有界的。(公关)
  • 支持通用类型别名。(公关)
  • rbs collection已被引入管理 gems 的 RBS。(文档)
  • 添加/更新了许多内置和标准库的签名。
  • 它还包括许多错误修复和性能改进。

有关更多信息,请参阅CHANGELOG.md

TypeProf

TypeProf 是 Ruby 的静态类型分析器。它从非类型注释的 Ruby 代码生成 RBS 的原型。有关详细信息,请参阅文档

自 Ruby 3.0.0 以来的主要更新是一个名为“TypeProf for IDE”的实验性 IDE 支持。

IDE 的 TypeProf 演示

vscode 扩展在每个方法定义上方显示一个猜测的(或明确写在 RBS 文件中的)方法签名,在可能导致名称错误或类型错误的代码下画一个红色下划线,并完成方法名称(即显示方法候选) . 详细看文档

此外,该版本还包括许多错误修复和性能改进。

性能改进

  • MJIT

     

    • 对于 Rails 等工作负载,默认值--jit-max-cache从 100 更改为 10000。JIT 编译器不再跳过长度超过 1000 条指令的方法的编译。
    • 为了支持 Rails 的 Zeitwerk,当启用类事件的 TracePoint 时,不再取消 JIT-ed 代码。

自 3.0 以来的其他显着变化

  • 单行模式匹配,例如 ,ary => [x, y, z]不再是实验性的。
  • 多重分配评估顺序略有变化。[错误 #4443]
    • foo[0], bar[0] = baz, qux评价为了bazquxfoo,然后bar在红宝石3.0。在 Ruby 3.1 中,它按照foobarbaz、 然后 的顺序进行计算qux
  • 可变宽度分配:字符串(实验性)[Bug #18239]

  • Psych 4.0 更改Psych.loadsafe_load默认设置。您可能需要使用 Psych 3.3.2 才能迁移到此行为。 [错误 #17866]
原文链接:https://www.oschina.net/news/175589
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章