Experimental feature in GraalVM

TruffleRuby 附加功能

TruffleRuby 旨在用作标准 Ruby 实现,可运行在其他实现上开发的程序,但它还提供了超出其他实现的功能。

有关与其他 Ruby 实现的兼容性,请参阅 兼容性 指南。

检测是否在 TruffleRuby 上运行 #

您可以使用 --version 命令行选项。TruffleRuby 将报告例如

truffleruby ..., like ruby ..., GraalVM CE Native [x86_64-darwin]

在 Ruby 代码中,您可以查看标准的 RUBY_ENGINE 常量,它将是 'truffleruby'。在 C 代码中,定义了 TRUFFLERUBY

还可以使用特征检测而不是查看 RUBY_ENGINE

您可以使用标准的 RUBY_ENGINE_VERSION 常量找到 TruffleRuby 的版本号。

TruffleRuby 方法和类 #

TruffleRuby 在 TruffleRuby 模块中提供了这些非标准方法和类,它们提供了附加功能

  • TruffleRuby.jit? 报告 GraalVM 编译器是否可用并是否将被使用。

  • TruffleRuby.native? 报告 TruffleRuby 是否作为本机可执行文件编译。

  • TruffleRuby.cexts? 报告 TruffleRuby 是否具有可用的 GraalVM LLVM 运行时以用于 C 扩展。

  • TruffleRuby.revision 报告用于构建 TruffleRuby 的源代码控制修订版,作为字符串。也可以作为 RUBY_REVISION 使用,类似于 CRuby 2.7+。

  • TruffleRuby.full_memory_barrier 确保在屏障之前对加载或存储的重新排序与屏障之后对加载或存储的重新排序不存在。

  • TruffleRuby.graalvm_home 返回 GraalVM 主目录,如果在 GraalVM 之外运行(例如,本机独立),则返回 nil

  • TruffleRuby.synchronized(object) { } 将在持有每个对象实例的隐式锁的情况下运行块。

原子引用 #

  • atomic_reference = TruffleRuby::AtomicReference.new(value=nil) 创建一个新的原子引用,该引用引用给定对象。

  • atomic_reference.get 获取原子引用的值,并返回该值。

  • atomic_reference.set(new_value) 设置原子引用的值,并对涉及 new_value 的写入进行内存屏障。

  • atomic_reference.get_and_set(new_value) 设置原子引用的值,返回先前值,并对涉及 new_value 的写入进行内存屏障。

  • atomic_reference.compare_and_set(expected_value, new_value) 设置原子引用的值,仅当它当前具有预期值时才设置,返回一个布尔值以表明是否已设置,并对涉及 new_value 的写入进行内存屏障。对于数字对象,它将获取当前值,然后检查当前值是否也是数字,以及它是否等于预期值(通过调用 ==),然后执行原子比较和设置。

  • AtomicReference 可被序列化。

并发映射 #

TruffleRuby::ConcurrentMap 是一种键值数据结构,类似于 Hash,使用 #hash#eql? 来比较键,使用标识来比较值。与 Hash 不同,它是不排序的。TruffleRuby::ConcurrentMap 上的所有方法都是线程安全的,但与完全同步的实现相比,应具有更高的并发性。它旨在被诸如 concurrent-ruby 之类的 gem 使用 - 请通过此 gem 使用,而不是直接使用。

  • map = TruffleRuby::ConcurrentMap.new([initial_capacity: ...], [load_factor: ...])

  • map[key] = new_value

  • map[key]

  • map.compute_if_absent(key) { computed_value } 如果未找到键,则运行块并存储结果。块最多运行一次。返回计算出的值。

  • map.compute_if_present(key) { |current_value| computed_value } 如果找到键,则运行块并存储结果。如果块返回 nil,则该键的条目将被删除。块最多运行一次。返回最终值,如果块返回 nil,则返回 nil

  • map.compute(key) { |current_value| computed_value } 运行块,传递当前值(如果有)或 nil,并存储结果。如果块返回 nil,则该键的条目将被删除。返回计算出的值。

  • map.merge_pair(key, new_value) { |existing_value| merged_value } 如果未找到键或为 nil,则存储新值,否则调用块并存储结果,或者如果块返回 nil 则删除条目。返回该条目的最终值,如果块返回 nil 则返回 nil

  • map.replace_pair(key, expected_value, new_value) 替换键的值,但前提是其现有值与 expected_value 相同(通过标识进行比较)。返回是否已替换值。

  • map.replace_if_exists(key, value) 替换键的值,但前提是已找到它。如果键存在,则返回 value,否则返回 nil

  • map.get_and_set(key, new_value) 设置键的值并返回先前值。

  • map.key?(key) 返回键是否在映射中。

  • map.delete(key) 如果键存在,则从映射中删除键,返回该值,如果不存在,则返回 nil

  • map.delete_pair(key, expected_value) 删除键,但前提是其现有值与 expected_value 相同(通过标识进行比较)。返回是否已删除键。

  • map.clear 从映射中删除所有条目。

  • map.size 提供映射中条目的数量。

  • map.get_or_default(key, default_value)

  • map.each_pair { |key, value| ... }

FFI #

TruffleRuby 包含 Ruby-FFI 后端。这应该是透明的:您可以像往常一样安装 ffi gem,它将使用 TruffleRuby 的 FFI 后端。TruffleRuby 还包含 FFI gem 的默认版本,因此 require "ffi" 始终在 TruffleRuby 上有效,即使 gem 未安装。

多语言编程 #

PolyglotJava 模块提供了对 GraalVM 的多语言编程功能的访问。它们在 多语言编程 指南中进行了描述。

不支持的附加功能 #

您可能能够找到一些此处未列出的其他模块和方法,这些模块和方法看起来很有趣,例如 Truffle::POSIXTruffle::FFI。本文档中未列出的其他模块和方法旨在支持 TruffleRuby 的实现,不应使用。将来它们可能会被修改或对用户程序不可见,因此您不应使用它们。

除了 MRI 提供的那些之外,TruffleRuby C 扩展标头中的额外宏、函数和变量(例如以 rb_tr_* 开头的那些)不受支持,不应被任何 C 扩展使用。

与我们联系