Ruby 3.4.0 发布,这是一种动态的面向对象编程语言,专注于程序开发的高效率,并融合了 Perl、Java、Python、Smalltalk、Eiffel、Ada 和 Lisp 的最佳功能。该项目代码在BSD(“2-clause BSDL”)和“Ruby”许可证下分发,它指的是最新版本的GPL许可证,并与GPLv3兼容。
主要改进:
- 添加了一个新的标识符“it”,默认情况下使用块中设置的未命名参数进行标识。当向块传递一个参数时,新标识符类似于之前可用的变量“_1”。引入新标识符的原因是希望消除由于将多个参数传递到块的可能性而引起的混乱(“it”意味着始终只有一个参数,并且当指定“_1”时,它不是清除参数“_2”是否存在)。 [1, 2, 3].each { put _1 } [1, 2, 3].each { put it } ary = [“foo”, “bar”, “baz”] p ary.map { it.upcase } #=> [“FOO”、“BAR”、“BAZ”]
- 默认情况下,Prism 解析器处于启用状态,它更便携、更易于维护,并且允许您处理代码中的错误。要解析 Ruby 代码,您的程序可以访问 Prism.parse(source) 方法来获取代码的 AST 表示,使用 Prism.parse_comments(source) 来从代码中提取注释,并使用 Prism.parse_success?(source) 来检查对于代码中的错误。要返回之前使用的“parse.y”解析器,可以使用“--parser=parse.y”选项。
- “socket”库实现并默认支持 Happy Eyeballs 算法 (RFC 8305),以便在连接到可通过 IPv4 和 IPv6 地址同时访问的主机时选择最佳协议。使用 Happy Eyeball 算法时,客户端立即解析主机的 IPv4 和 IPv6 地址,并通过 IPv6 发送连接请求,然后延迟 250 ms 尝试并行连接到主机绑定的其他地址,而无需等待。等待先前进行的连接尝试的结果。最先建立的连接保持活动状态,其他连接则关闭。以前,在 Ruby 程序中调用 TCPSocket.new 和 Socket.tcp 方法会导致连续尝试解析 IPv4/IPv6 地址和连接,从而导致延迟,例如,当第一次尝试通过 IPv6 连接,但系统没有支持IPv6。要返回旧行为,您可以在调用方法时使用环境变量“RUBY_TCP_NO_FAST_FALLBACK=1”、设置“Socket.tcp_fast_fallback=false”或参数“fast_fallback: false”。
- 我们继续优化 YJIT JIT 编译器的性能,该编译器由 Shopify 电子商务平台的开发人员开发,作为提高使用 Rails 框架并调用大量方法的 Ruby 程序性能的计划的一部分。与 MJIT JIT 编译器不同,新的 YJIT 使用惰性基本块版本控制 (LBBV),而不是处理整个方法,并以 Rust 编写的集成 JIT 编译器的形式实现。使用 LBBV,JIT 首先仅编译方法的开头部分,并在执行过程中确定所使用的变量和参数的类型后,稍后编译其余部分。
在新版本中,YJIT 性能在 x86_64 和 ARM64 系统上的大多数测试中都得到了提高。添加了新的优化:使用局部变量和方法参数的寄存器;使用 Array#each、Array#select 和 Array#map 的 Ruby 实现;空方法和返回常量、它们自己的实例或输入参数的方法的内联部署;针对特定方法的单独代码生成器;优化字符串处理(String#getbyte、String#setbyte);位运算的加速。
内存消耗的减少是由于元数据压缩和统一系统实施的限制。添加了选项“--yjit-mem-size”,默认设置为128MiB,会影响整体内存消耗。添加了“--yjit-log”选项以准确跟踪编译的代码。
- 提供了动态加载以共享库形式收集的替代垃圾收集器的能力。 RUBY_GC_LIBRARY 环境变量应用于指定具有所需垃圾收集器的库。默认的内置垃圾收集器现在可以编译为单独的库。作为替代方案,添加了基于 Rust 编写的 MMTk 框架的垃圾收集器。
- 允许将值为 nil 的命名参数传递给方法。值为“**nil”的参数现在被视为“**{}”的空哈希,而不将命名参数传递给该方法。
- 索引不允许块传递或命名参数,例如“a[&b]=c”和“o[1, a: 1]”。
- JSON.parse 方法已经过优化,现在比 json 2.7 包快一倍半。
来源: opennet.ru
