- GraalVM for JDK 23 (最新)
- GraalVM for JDK 24 (抢先体验)
- GraalVM for JDK 21
- GraalVM for JDK 17
- 存档
- 开发版本
TruffleRuby
TruffleRuby 是 GraalVM 对 Ruby 编程语言 的高性能实现。
入门 #
TruffleRuby 有两种发行版
- 原生独立版:这仅包含 TruffleRuby 的 原生配置。
- JVM 独立版:这仅包含 TruffleRuby 的 JVM 配置。这包括对其他语言的支持,例如 Java、JavaScript、Python 和 WebAssembly。
您可以安装其中任何一个
- 通过您的 Ruby 管理器/安装程序(RVM、rbenv、chruby、asdf、ruby-build、ruby-install)。
我们建议尝试 TruffleRuby 开发版本,其中包含最新的修复和改进(将VERSION
替换为dev
)。
原生独立版
RVM: $ rvm install truffleruby # or truffleruby-head
rbenv: $ rbenv install truffleruby-VERSION
asdf: $ asdf install ruby truffleruby-VERSION
chruby: $ ruby-install truffleruby
$ ruby-build truffleruby-VERSION ~/.rubies/truffleruby-VERSION
JVM 独立版
rbenv: $ rbenv install truffleruby+graalvm-VERSION
asdf: $ asdf install ruby truffleruby+graalvm-VERSION
chruby: $ ruby-install truffleruby-graalvm
$ ruby-build truffleruby+graalvm-VERSION ~/.rubies/truffleruby+graalvm-VERSION
- 在 CI 中使用 GitHub Actions,请参阅 在 CI 中测试 TruffleRuby 以获取更多详细信息和其他 CI。
- uses: ruby/setup-ruby@v1
with:
ruby-version: truffleruby # or truffleruby-head or truffleruby+graalvm or truffleruby+graalvm-head
-
通过 Docker。对于原生独立版,请参阅 官方发布镜像 和 夜间构建镜像。对于 JVM 独立版,目前还没有 Docker 镜像,但您可以轻松地 下载它 并参考 原生独立版 Dockerfile。
-
手动,按照 文档 操作。
您可以像往常一样使用 gem
和 bundle
来安装 gem。
请在 GitHub 上报告您可能遇到的任何问题。
目标 #
TruffleRuby 的目标是
- 更快地运行惯用的 Ruby 代码。
- TruffleRuby 是 最快的 Ruby 实现,适用于许多 CPU 密集型基准测试。
- 并行运行 Ruby 代码。
- TruffleRuby 没有全局解释器锁,并行运行 Ruby 代码。
- 支持 C 扩展。
- 许多 C 扩展开箱即用,包括数据库驱动程序。
- 提供与 Java、JavaScript、Python 和 WebAssembly 等语言的快速且低开销的互操作性。
- 由 GraalVM 提供,请参阅 多语言文档。
- 提供新的工具,例如跨语言工作的调试器和监视器。
- 包括分析器、调试器、VisualVM 等。请参阅 工具文档。
- 在保持与 Ruby 标准实现高度兼容性的同时,提供上述所有内容。
TruffleRuby 运行时配置 #
TruffleRuby 有两种主要的运行时配置,原生和 JVM,它们具有不同的权衡。
配置 | 原生(--native ,默认) |
JVM(--jvm ) |
---|---|---|
启动 TruffleRuby 所需时间 | 与 MRI 启动速度差不多快 | 更慢 |
达到峰值性能所需时间 | 更快 | 更慢 |
峰值性能(也考虑 GC) | 良好 | 最佳 |
Java 主机互操作性 | 需要反射配置 | 正常工作 |
要找出正在使用的运行时配置,请在命令行上运行 ruby --version
,或检查 Ruby 代码中 RUBY_DESCRIPTION
或 TruffleRuby.native?
的值。运行时配置在 部署 TruffleRuby 中有更详细的介绍。
系统兼容性 #
TruffleRuby 在以下系统上积极测试
- Oracle Linux 7、8、9
- Ubuntu 18.04、20.04、22.04(所有 LTS)
- Fedora 37、38
- Debian 10、11、12
- macOS 11(Big Sur)
体系结构
- AMD64(又名
x86_64
):支持 - AArch64(又名
arm64
):支持 Linux(从 21.2 开始)和 macOS(从 22.2 开始)
如果您严重限制环境,例如卸载系统文件系统(如 /dev/shm
),您可能会发现 TruffleRuby 无法工作。
依赖项 #
- make、gcc 和 g++ 用于构建 C 和 C++ 扩展
- libssl 用于
openssl
C 扩展 - libyaml 用于
psych
C 扩展 - zlib 用于
zlib
C 扩展
如果没有这些依赖项,许多库(包括 RubyGems)将无法工作。TruffleRuby 会尝试在缺少依赖项时打印一个友好的错误消息,但这只能在尽力而为的基础上完成。
如果您还没有设置 UTF-8 本地化,您也需要设置它。
如果您想从源代码构建 TruffleRuby,请参阅 贡献者工作流程 文档。
当前状态 #
我们建议在他们的 gem 和应用程序上尝试 TruffleRuby 的人 与我们联系,以便在他们可能需要帮助时提供帮助。
TruffleRuby 运行 Rails 并与许多 gem 兼容,包括 C 扩展。TruffleRuby 尚未与 MRI 3.2 完全兼容。请 报告 您可能遇到的任何兼容性问题。TruffleRuby 通过了大约 97% 的 ruby/spec,比任何其他替代 Ruby 实现都要多。
在性能方面,TruffleRuby 迄今为止 是 yjit-bench 基准测试套件中最快的 Ruby 实现,其中包括 railsbench
等。为了实现这种性能,TruffleRuby 需要大量的预热,就像其他高级 JIT 编译器一样。如果您发现任何性能问题,请参阅 此指南。
发布 #
TruffleRuby 与 GraalVM 同时发布。TruffleRuby 继续使用基于公历年的版本编号,例如 21.x 和 22.x,与 2023 年之前的 GraalVM 相同。请参阅 发布路线图 和 即将发布的版本列表,以获取发布日期以及有关支持版本持续时间的信息。GraalVM 社区版发布最多支持一年。 更长时间的支持 可用于 Oracle GraalVM。
从 MRI 迁移 #
在大多数情况下,TruffleRuby 应该可以作为 MRI 的直接替换,但您应该阅读有关我们 兼容性 的内容。
从 JRuby 迁移 #
对于许多用例,TruffleRuby 应该可以作为 JRuby 的直接替换。但是,我们与 Java 集成的方法不同于 JRuby,因此您应该阅读我们的 迁移指南。
联系 #
与我们联系的最佳方式是加入 GraalVM Slack 上的 #truffleruby
频道。您也可以在 Twitter 上关注 @TruffleRuby,或发送电子邮件至 benoit.daloze@oracle.com。
请通过 报告漏洞指南 中概述的流程报告安全漏洞,而不是通过公开渠道(例如 GitHub 问题或 Gitter 对话)。
邮件列表 #
有关 GraalVM(包括 TruffleRuby)的公告发布在 graal-dev 邮件列表上。
作者 #
TruffleRuby 的主要作者按首次贡献时间排序:Chris Seaton、Benoit Daloze、Kevin Menard、Petr Chalupa、Brandon Fish、Duncan MacGregor、Christian Wirth、Rafael França、Alan Wu、Nicolas Laurent、Carol Chen、Nikolay Sverchkov、Lillian Zhang、Tom Stuart 和 Maple Ong。
安全 #
请参阅 SECURITY,了解如何向 Oracle 报告安全漏洞。对于 Ruby 中已知的漏洞,请参阅 known-cves 文件。
许可证 #
TruffleRuby 受版权保护 (c) 2013-2024 Oracle 和/或其关联公司,并根据以下三种许可证之一的条款提供给您
- Eclipse 公共许可证 2.0 版,或
- GNU 通用公共许可证 2 版,或
- GNU 宽通用公共许可证 2.1 版。
有关进一步的许可信息,请参阅 LICENCE、3rd_party_licenses 和 doc/legal/legal。
署名 #
TruffleRuby 包含来自 JRuby(例如解析器、JCodings、Joni)、来自 Rubinius 项目的核心库代码以及来自 Ruby 标准实现 MRI 的代码。