- JDK 23対応GraalVM (最新)
- JDK 24対応GraalVM (早期アクセス)
- JDK 21対応GraalVM
- JDK 17対応GraalVM
- アーカイブ
- 開発ビルド
よくある質問
TruffleRubyとは? #
TruffleRubyは、Truffle言語実装フレームワークとGraalVMコンパイラを使用してGraalVM上に構築された、Rubyプログラミング言語の高性能実装です。TruffleRubyは、高性能ポリグロットプログラミングのためのプラットフォームであるGraalVMの一部です。
Truffleとは? #
Truffle言語実装フレームワークは、ASTインタプリタを記述するためのJavaフレームワークです。Truffleを使用して言語を実装するには、言語のASTを記述し、各ノードを解釈(アクションを実行)するためのメソッドを追加します。
Truffleは、特殊化の概念も組み込んでいます。ほとんどのASTインタプリタでは、ノードはメガモーフィックです。つまり、すべての可能な型とその他の可能な条件を処理します。Truffleフレームワークでは、同じセマンティックアクションに対して、異なる型と条件に対していくつかの異なるノードを記述します。ランタイム条件が変化すると、使用しているノードを切り替えます。プログラムがウォームアップした後、実際に使用している型と条件に合わせて正確に調整されたASTが得られるはずです。これらの条件が変更された場合は、ノードを再び切り替えることができます。
GraalVMコンパイラとは? #
GraalVMコンパイラは、OpenJDK Java Virtual MachineのJust-In-Timeコンパイラ(JITコンパイラ、または通常は*動的コンパイラ*と呼びます)の新しい実装です。現在のコンパイラとは異なり、GraalはJavaで記述されており、実行中のプログラムにJava APIを公開します。これは、バイトコードを生成する代わりに、JVM言語がコンパイラを直接制御できることを意味します。ただし、これは複雑なので、通常、TruffleフレームワークはGraalVMコンパイラを代わりに使用して、ASTインタプリタを機械語に*部分的に評価*します。
GraalVMとは? #
GraalVMは、TruffleRubyが実行されるプラットフォームです。高性能ポリグロットプログラミングのためのシステムです。
より具体的には、GraalVMは、GraalVMコンパイラやGraalVM Native Imageなどの追加コンポーネントを備えたJDK(Java Development Kit)です。GraalVMコンパイラとGraalVM Native Imageは、TruffleRubyなどのTruffle言語で使用されます。
TruffleRubyを入手するにはどうすればよいですか? #
TruffleRubyをインストールするには、いくつかの方法があります。はじめにをご覧ください。
標準のJVMではTruffleRubyが遅いのはなぜですか? #
TruffleRubyを実行する際の想定される方法は、GraalVMコンパイラを使用することです。TruffleRubyは、これがないJVMで効率的に動作するように設計されていません。
GraalVMではTruffleRubyの方が高速なのはなぜですか? #
GraalVMコンパイラで実行する場合、TruffleフレームワークはGraalVMコンパイラによって公開されているAPIを使用できます。Truffleフレームワークは、Rubyメソッドの実行に関与するすべてのASTインタプリタメソッドのバイトコード表現を取得し、それらを単一のJavaメソッドのようなものに結合し、それらをまとめて最適化し、単一の機械語関数を生成します。また、Truffleフレームワークは、コードの最適化解除など、通常はJavaアプリケーションでは使用できないJVM機能のラッパーを提供します。TruffleRubyはこれを使用して、Rubyの劇的にシンプルで高速な実装を提供します。
このコードはどこから来たのですか? #
Chris Seatonは、2013年前半にOracle Labsでのインターンシップの一環として、Truffle and GraalにRubyの実装を作成しました。このコードは2014年初頭にJRubyにマージされました。Benoit DalozeとKevin Menardは2014年後半に研究者として参加し、2015年にはPetr Chalupa、2016年にはBrandon Fish、2017年にはDuncan MacGregorが参加しました。それ以来、Oracle Labs以外の人々からの貢献も受け入れています。2017年に、コードが成熟した後、JRubyからフォークバックされました。
TruffleRubyについて誰に聞けばよいですか? #
このREADMEページの「お問い合わせ」セクションをご覧ください。
TruffleRubyを使用しているかどうかはどうすればわかりますか? #
`RUBY_ENGINE`は`'truffleruby'`になります。
GraalVMコンパイラを搭載したVMを使用しているかどうかはどうすればわかりますか? #
`ruby --version`は`GraalVM CE`または`Oracle GraalVM`を報告します。 23.0より前のTruffleRubyバージョンは、`Oracle GraalVM`の代わりに`GraalVM EE`を報告します。
また、`TruffleRuby.jit?`は、GraalVMコンパイラで実行しているかどうかを示します。
Oracle GraalVMとは何ですか? #
Oracle GraalVMは、GraalVM無料利用規約に基づいて利用可能な、OracleからのGraalVMディストリビューションです。 Oracle GraalVMは、最高のTruffleRubyエクスペリエンスを提供します。GraalVM Community Editionよりも大幅に高速でメモリ効率が高くなっています。
Community Edition of GraalVMを使用していることをどのように確認できますか? #
`ruby --version`は`GraalVM CE`を報告します。
Oracle GraalVMを使用していることをどのように確認できますか? #
`ruby --version`は`Oracle GraalVM`を報告します。23.0より前のTruffleRubyバージョンは、代わりに`GraalVM EE`を報告します。
ネイティブバージョンのTruffleRubyを使用していることをどのように確認できますか? #
`ruby --version`は`Native`を報告します。
`TruffleRuby.native?`は`true`を返します。
GraalVMコンパイラが動作していることをどのように確認できますか? #
このプログラムを`test.rb`に入れます
loop do
14 + 2
end
`--engine.TraceCompilation`を使用して、GraalVMコンパイラを使用して何かをコンパイルするときにTruffleフレームワークに指示するように依頼します。
ruby --engine.TraceCompilation test.rb
[truffle] opt done block in <main> test.rb:1 <opt> <split-3a9ffa1b> |ASTSize 8/ 8 |Time 103( 99+4 )ms |DirectCallNodes I 0/D 0 |GraalNodes 24/ 3 |CodeSize 69 |CodeAddress 0x11245cf50 |Source ../test.rb:1
ここで、TruffleはGraalVMコンパイラを使用して、127のブロック(機械語へのループ)をコンパイルすることを決定したことがわかります。合計でわずか69バイトの機械語です。
TruffleRubyがベンチマークでうまく機能しないのはなぜですか? #
まだ調べていないベンチマークでは、新しいコードパスを特殊化する必要がある場合があります。現在、ベンチマークやアプリケーションで使用しているコードパスに特化を追加しました。それらを追加することは一般的に複雑ではなく、時間の経過とともに幅広いアプリケーションをカバーするための専門知識が得られます。
最高のパフォーマンスを得るには、Oracle GraalVMを使用していることを確認してください。
これは`invokedynamic`とどのように関連していますか? #
TruffleRubyはバイトコードを生成しないため、`invokedynamic`を使用しません。ただし、同様の結果を達成する最適化メソッドディスパッチメカニズムがあります。
JRubyもTruffleに切り替えないのはなぜですか? #
JRubyは、Rubyに最適化と新機能を追加するための異なるアプローチを採用しています。JRubyとTruffleRubyはどちらも重要なプロジェクトです。
なぜJRubyからフォークしたのですか? #
Java実装コードの大部分を使用できるようにするために、JRubyにマージしました。使用していたコードを目的に合わせて変更する必要があり、JRubyのコア部分に依存しなくなった時点で、JRubyからフォークバックしました。フォークにより、コードベースを簡素化することもできました。