- GraalVM for JDK 23 (最新)
- GraalVM for JDK 24 (早期アクセス)
- GraalVM for JDK 21
- GraalVM for JDK 17
- アーカイブ
- 開発ビルド
TruffleRuby追加機能
TruffleRubyは、他の実装で開発されたプログラムを実行する標準的なRuby実装として使用することを意図していますが、他の実装にはない追加機能も提供します。
他のRuby実装との互換性については、互換性ガイドを参照してください。
TruffleRuby上で実行しているかどうかを検出する #
--version
コマンドラインオプションを使用できます。TruffleRubyは、例えば以下のように報告します。
truffleruby ..., like ruby ..., GraalVM CE Native [x86_64-darwin]
Rubyコードでは、標準のRUBY_ENGINE
定数を確認できます。これは'truffleruby'
になります。CコードではTRUFFLERUBY
が定義されています。
RUBY_ENGINE
を確認する代わりに、機能検出を使用することも可能です。
TruffleRubyのバージョン番号は、標準のRUBY_ENGINE_VERSION
定数を使用して取得できます。
TruffleRubyメソッドとクラス #
TruffleRubyは、TruffleRuby
モジュールに追加機能を提供する、これらの非標準メソッドとクラスを提供します。
-
TruffleRuby.jit?
は、GraalVMコンパイラが利用可能で、使用されるかどうかを報告します。 -
TruffleRuby.native?
は、TruffleRubyがネイティブ実行ファイルとしてコンパイルされているかどうかを報告します。 -
TruffleRuby.cexts?
は、TruffleRubyにC拡張機能用のGraalVM LLVMランタイムが利用可能かどうかを報告します。 -
TruffleRuby.revision
は、TruffleRubyのビルドに使用されたソースコード管理リビジョンを文字列として報告します。CRuby 2.7+と同様にRUBY_REVISION
としても利用できます。 -
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 }
キーが見つからない場合、ブロックを実行して結果を保存します。ブロックは最大1回実行されます。計算された値を返します。 -
map.compute_if_present(key) { |current_value| computed_value }
キーが見つかった場合、ブロックを実行して結果を保存します。ブロックがnil
を返す場合、そのキーのエントリは削除されます。ブロックは最大1回実行されます。最終的な値を返し、ブロックが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のデフォルトバージョンも含まれているため、gemがインストールされていなくても、require "ffi"
はTruffleRubyで常に機能します。
ポリグロットプログラミング #
Polyglot
とJava
モジュールは、GraalVMのポリグロットプログラミング機能へのアクセスを提供します。ポリグロットプログラミングガイドで説明されています。
サポートされていない追加機能 #
Truffle::POSIX
やTruffle::FFI
など、ここにリストされていない興味深いモジュールやメソッドを見つけることができる場合があります。このドキュメントにリストされていない追加のモジュールとメソッドは、TruffleRubyの実装をサポートするために設計されており、使用しないでください。将来、変更されるか、ユーザープログラムに対して非表示になる可能性があり、使用しないでください。
MRIによって提供されるもの以外のTruffleRuby C拡張ヘッダー内の追加マクロ、関数、変数(rb_tr_*
で始まるものなど)はサポートされておらず、C拡張では使用しないでください。