TruffleRuby:基于 GraalVM 的高性能 Ruby 实现

原文 HN 讨论

文章摘要

TruffleRuby 是由 Chris Seaton 创建的一个高性能 Ruby 语言实现,构建在 Oracle 的 GraalVM 和 Truffle 框架之上。Chris Seaton 是 Ruby 社区中备受尊敬的研究者和工程师,他的个人网站详细记录了 TruffleRuby 的技术架构、发展历程和性能成就。遗憾的是,Chris 已经离世,但项目仍在由他的同事们持续推进。

TruffleRuby 的核心理念是利用 Truffle 语言实现框架和 Graal JIT 编译器,将 Ruby 代码编译为高度优化的机器码。与标准的 MRI(CRuby)解释器相比,TruffleRuby 在计算密集型任务上可以获得数倍甚至数十倍的性能提升。其工作原理是:开发者用 Ruby 编写解释器节点,Truffle 框架自动将这些节点通过部分求值(partial evaluation)转化为 Graal 编译器可以优化的中间表示,最终生成与手写 C 代码性能相当的机器码。

TruffleRuby 的一个重要特性是对原生扩展的良好支持。许多 Ruby 的流行 gem 依赖 C 语言编写的原生扩展,TruffleRuby 不仅能运行纯 Ruby 代码,还能加速 C 扩展代码,无需开发者做任何修改。这包括数据库适配器等关键基础设施 gem。

该项目的历史可以追溯到 Sun Microsystems 时代的 MaxineVM 和 SquawkVM 等研究项目,这些项目为 GraalVM 的诞生奠定了基础。TruffleRuby 既是一个学术研究项目,产出了大量关于动态语言优化的论文,也是一个可用于生产环境的工程项目。GraalVM 生态提供了社区版(开源)和企业版(闭源,性能更好),RedHat 还维护了名为 Mandrel 的发行版。

TruffleRuby 还展示了 GraalVM 的多语言互操作能力——Ruby 代码可以直接调用 Java、JavaScript、Python 等其他 GraalVM 支持的语言,打通了不同语言生态系统之间的壁垒。

HN 评论精华

对 Chris Seaton 的缅怀:

这篇讨论带有明显的追思色彩。nirvdrum(TruffleRuby 现任维护者之一)表示项目仍在强劲发展,邀请社区通过 Slack 和 GitHub 参与。semiquaver、vidarh、claudiug、ch4s3 等多人回忆了与 Chris 的交往,称他是”一个伟大的人”、”善良而温和的人”。vidarh 特别提到 Chris 曾热心审阅他的自举 Ruby 编译器项目。

实际性能测试:

petercooper 报告在纯 Ruby JPEG 编解码器上,TruffleRuby 实现了 2-3 倍的性能提升。但他也指出,MRI 近年的改进正在缩小差距,且原生依赖仍是潜在限制因素。eregon(TruffleRuby 团队成员)确认”大多数流行的原生扩展直接就能工作”。

许可证困境:

jwilliams 和 freedomben 都提到,GraalVM 早期令人困惑的许可证条款曾阻碍了采用。虽然条款后来改善了,但”是否为时已晚”仍是一个悬而未决的问题。nirvdrum 澄清了开源社区版、RedHat Mandrel 发行版和闭源企业版之间的关系。

JRuby vs TruffleRuby:

shevy-java 表达了对 JRuby 更好可访问性的偏好,主张统一 Java 生态中的 Ruby 实现。drzaiusx11 分享了 JRuby 在生产环境中桥接 Ruby 和 Java 代码库的成功案例,对 TruffleRuby 的互操作 API 表示好奇。thibaut_barrere 则报告了将现有 JRuby 应用迁移到 TruffleRuby 时遇到的问题。