Ruby 2.6.0-preview1 发布

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

Ruby 2.6.0-preview1 是迈向 Ruby 2.6.0 的第一个预览版本。 此预览版 1 的发布时间比平时早,因为它包含一个重要的新功能:JIT。

JIT

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

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

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

此 JIT 版本的的主要目的是提供一个机会来检查它是否适用于您的平台,并在 2.6 版本发布之前找出安全风险。 目前,只有当 Ruby 由 gcc 或 clang 构建,并且编译器在运行时可用时,才支持 JIT 编译器。 否则,您现在无法使用它。

在 2.6.0-preview1 中,我们只是在为 JIT 准备基础设施,并且只实现了极少的优化。您可以使用此版本在微基准测试中衡量一些潜在的改进,但它尚未准备好用于对 Ruby 的 JIT 编译器的最终性能进行基准测试,尤其是像 Rails 应用程序这样的大型程序。

我们将在 JIT 编译器中实现方法内联,预计这将显著提高 Ruby 的性能。

此外,我们还计划增加支持的平台,下一个计划是支持 Visual Studio。

敬请期待 Ruby 性能的新时代。

新特性

  • 添加 Random.bytes。[特性 #4938]
  • 添加 Binding#source_location。[特性 #14230]

    此方法返回绑定的源位置,一个由 __FILE____LINE__ 组成的 2 元素数组。 传统上,相同的信息可以通过 eval("[__FILE__, __LINE__]", binding) 获取,但我们计划更改此行为,以便 Kernel#eval 忽略 binding 的源位置 [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 倍的改进。

自 2.5 以来的其他重要更改

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

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

  • 合并了 RubyGems 2.7.6

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

自 Ruby 2.5.0 以来,通过这些更改,1115 个文件发生了更改,增加了 23023 行代码 (+),删除了 14748 行代码 (-)

今天,2 月 24 日,是 Ruby 的 25 岁生日。 祝 Ruby 生日快乐,并享受使用 Ruby 2.6.0-preview1 编程的乐趣!

下载

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

    SIZE:   16082501 bytes
    SHA1:   94b4a2f5f992dc9855364284e9c64316bf129c90
    SHA256: 2023c42676d9237481e1a97157d5e2ecc10db5e320d5b9cf872ec1d293265d61
    SHA512: 004696c4f087333ba7cb2285418dcce70f399966ae8fed817aab9759fd2d75beb088c4aeb294fcd4260112e8422f490cd4dbdfce402d73f96bb679b8bb3e1607
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview1.zip

    SIZE:   19807007 bytes
    SHA1:   24d76f67bf913348eca783a2ecf6f3faf37299ae
    SHA256: 6c883927e80430cf07f2d90728d6c2c71164223f378a48ebf964d3b66319f623
    SHA512: 1e7f318cec1b7875fd9891df671078de7585b556695a2a85708483ddcacfd6e0b63b70ec2535e92ff981b4f72063721ed552df49688e066666fcd7ae520ae667
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview1.tar.bz2

    SIZE:   14104578 bytes
    SHA1:   9f0fb79643a4673a839b0c8496eccc6e1dbd022d
    SHA256: 8bd6c373df6ee009441270a8b4f86413d101b8f88e8051c55ef62abffadce462
    SHA512: d9cb270529a97670d54f43a0236fab072714e715c39277dab70b7a1843ec818e6700e47e1384c7256f9e0ae41ab2c0b768a0de38a5ecf4f4fff5da6ef5ad4944
    
  • https://cache.ruby-lang.org/pub/ruby/2.6/ruby-2.6.0-preview1.tar.xz

    SIZE:   11423984 bytes
    SHA1:   bbbc89d760cdaadbca3cbff587295864edeff0af
    SHA256: 1d99139116e4e245ce543edb137b2a8873c26e9f0bde88d8cee6789617cc8d0e
    SHA512: d12ff29778d8d940344619881b4d8247c2fb6b44ac2b2dbddb7078828e893cfac9a5a95b5588f0afdbed52bdb6dea95cff1b9ce3ad47dfa62209e97dab8810b6