Ruby 2.6.0-preview3 发布

我们很高兴地宣布 Ruby 2.6.0-preview3 的发布。

Ruby 2.6.0-preview3 是 Ruby 2.6.0 的第三个预览版本。此 preview3 的发布是为了在发布候选版本之前测试新功能。

JIT

Ruby 2.6 引入了 JIT(即时)编译器的初始实现。

JIT 编译器旨在提高任何 Ruby 程序执行的性能。与其他语言的普通 JIT 编译器不同,Ruby 的 JIT 编译器以一种独特的方式进行 JIT 编译,它将 C 代码打印到磁盘上,并生成通用的 C 编译器进程以生成本机代码。另请参阅:Vladimir Makarov 的 MJIT 组织

如何使用:只需在命令行中指定 --jit$RUBYOPT 环境变量。指定 --jit-verbose=1 可以打印正在进行的 JIT 编译的基本信息。有关其他选项,请参阅 ruby --help

此 JIT 发布的的主要目的是提供一个机会来检查它是否适用于您的平台,并在 2.6 发布之前找出安全风险。当 Ruby 由 GCC、Clang 或 Microsoft VC++ 构建时,支持 JIT 编译器,它们需要在运行时可用。否则,您暂时无法使用它。

截至 Ruby 2.6.0 preview3,我们在名为 Optcarrot 的 CPU 密集型非平凡基准工作负载上实现了比 Ruby 2.5 快 1.7 倍的性能 https://gist.github.com/k0kubun/d7f54d96f8e501bbbc78b927640f4208。我们也将改进 Rails 应用程序等内存密集型工作负载的性能。

请继续关注 Ruby 性能的新时代。

RubyVM::AST [实验性]

Ruby 2.6 引入了 RubyVM::AST 模块。

此模块具有 parse 方法,该方法解析给定的 ruby 代码字符串并返回 AST(抽象语法树)节点,以及 parse_file 方法,该方法解析给定的 ruby 代码文件并返回 AST 节点。还引入了 RubyVM::AST::Node 类。您可以从 Node 对象获取位置信息和子节点。此功能是实验性的。不保证 AST 节点结构的兼容性。

新功能

  • Kernel#yield_self 添加了一个新别名 then[特性 #14594]

  • 没有 rescueelse 现在会导致语法错误。[实验性]

  • 常量名称可以以非 ASCII 大写字母开头。[特性 #13770]

  • 无限范围 [特性 #12912]

    引入了一个无限范围 (1..)。它的工作方式是无止境。这显示了典型用例

    ary[1..]                          # identical to ary[1..-1] without magical -1
    (1..).each {|index| ... }         # infinite loop from index 1
    ary.zip(1..) {|elem, index| ... } # ary.each.with_index(1) { ... }
    
  • 添加 Binding#source_location[特性 #14230]

    此方法返回绑定的源位置,这是一个由 __FILE____LINE__ 组成的 2 元素数组。传统上,相同的信息可以通过 eval("[__FILE__, __LINE__]", binding) 来检索,但我们计划更改此行为,以便 Kernel#eval 忽略绑定的源位置 [Bug #4352]。因此,用户应该使用这个新引入的方法来代替 Kernel#eval

  • 添加 :exception 选项,让 Kernel.#system 引发错误而不是返回 false[特性 #14386]

性能改进

  • 加速 Proc#call,因为我们不再需要关心 $SAFE[特性 #14318]

    通过多次使用 Proc#calllc_fizzbuzz 基准测试,我们可以测量到 1.4 倍的改进 [Bug #10212]

  • 加速 block.call,其中 block 是传递的块参数。[特性 #14330]

    Ruby 2.5 提高了块传递性能。[特性 #14045] 此外,Ruby 2.6 提高了传递块调用的性能。通过微基准测试,我们可以观察到 2.6 倍的改进。

  • 引入了瞬态堆 (theap)。[Bug #14858] [特性 #14989] theap 是为由特定类(Array、Hash、Object 和 Struct)指向的短期内存对象管理的堆。例如,创建小型且短期的 Hash 对象的速度快 2 倍。通过 rdoc 基准测试,我们观察到 6-7% 的性能改进。

自 2.5 以来的其他显著变化

  • $SAFE 是一个进程全局状态,我们可以再次将其设置为 0[特性 #14250]

  • safe_level 传递给 ERB.new 已被弃用。trim_modeeoutvar 参数已更改为关键字参数。[特性 #14256]

  • 合并 RubyGems 3.0.0.beta2。--ri--rdoc 选项已被删除。请使用 --document--no-document 选项代替它们。

  • 合并 Bundler 作为默认 gem。

有关详细信息,请参阅 NEWS提交日志

自 Ruby 2.5.0 以来,进行了这些更改,更改了 6474 个文件,插入了 171888 行 (+),删除了 46617 行 (-)

享受使用 Ruby 2.6.0-preview3 编程的乐趣!

下载

  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview3.tar.gz

    SIZE:   17071670 bytes
    SHA1:   67836fda11fa91e0b988a6cc07989fbceda025b4
    SHA256: 60243e3bd9661e37675009ab66ba63beacf5dec748885b9b93916909f965f27a
    SHA512: 877278cd6e9b947f5bb6ed78136efb232dcc9c5c218b7236576171e7c3cd7f6b7d10d07d8402014a14aba1fcd1913a4370f0725c561ead41d8a3fe92029f7f76
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview3.zip

    SIZE:   21537655 bytes
    SHA1:   45f3c90dfffe03b746f21f24152666e361cbb41a
    SHA256: 9152af9e700349dcfa2eec196dd91587d42d70a6837fa2c415ebba1167587be1
    SHA512: 335de36cf56706326f4acc4bbd35be01e0ac5fff30d0a69b2e1630ba4c78f0e711822d1623d0099a517c824b154917d2f60be192dfb143a422cf1d17b38e1183
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview3.tar.bz2

    SIZE:   14973451 bytes
    SHA1:   5f2df5d8c5a3888ccb915d36a3532ba32cda8791
    SHA256: 1f09a2ac1ab26721923cbf4b9302a66d36bb302dc45e72112b41d6fccc5b5931
    SHA512: d1693625723796e8902f3e4c4fae444f2912af9173489f7cf18c99db2a217afc971b082fce7089e39f8edd54d762d2b4e72843c8306ed29b05ccb15ac03dbb5b
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview3.tar.xz

    SIZE:   12291692 bytes
    SHA1:   7f8216247745215e9645568e7a02140f9a029b31
    SHA256: 9856d9e0e32df9e5cdf01928eec363d037f1a76dab2abbf828170647beaf64fe
    SHA512: b4d3b17ecf96272c43cd7518c0b54dee63fc1150ad143e1d9c9d708506fe78676c80eb96cc47b8d46d1128bd483a53f16c944963a03d1f99f00131b74714df7b