💎

Truffule Rubyの高パフォーマンスの仕組みを調べてみた

2023/12/06に公開

この記事はPharmaXアドベントカレンダー2023年の15日目の記事です。

はじめに

TruffleRubyは、Oracle Labsが開発した、Rubyの高パフォーマンス実装です。
Truffle言語実装フレームワークとGraalVMコンパイラを使用し、GraalVM上で動作します。
TruffleRubyはこれらの技術により、従来のMRI(Matz's Ruby Interpreter)に比べて高速な実行性能を提供します。

今回はTruffle言語実装フレームワークやGraalVMについて調査し、TruffleRubyがどのようにして高パフォーマンスを実現しているのかをまとめます。

GraalVM

GraalVMとは

GraalVMは、多言語対応の高性能ランタイムとして開発されたソフトウェアです。このプラットフォームは、Java Virtual Machine (JVM) ベースであり、様々なプログラミング言語のサポートを提供しています。GraalVMの主な特徴は、高度な最適化と多言語間のシームレスな統合です。Java、Scala、Kotlin、GroovyといったJVM言語のみならず、JavaScript、Ruby、R、Pythonなどの他の言語もサポートしています。

GraalVMコンパイラ

GraalVMコンパイラは、OpenJDK Java仮想マシンのJust-in-Time(JIT)コンパイラの新しい実装です。このコンパイラはJavaで記述されており、実行中のプログラムに対してJava APIを通じて直接操作を行うことができます。これにより、バイトコードを生成する代わりに、JVM言語でコンパイラを直接制御することが可能になります。

NativeImage

GraalVMはNativeImageというツールも提供しています。

NativeImageは、Javaコードをスタンドアロンの実行可能ファイルに事前にコンパイルする技術です。この実行可能ファイルには、アプリケーションのクラス、その依存性、ランタイムライブラリ、およびJDKから静的にリンクされたネイティブコードが含まれます。これにより、JVMと比較して起動時間が短縮され、ランタイムメモリオーバーヘッドが削減され、全体的なパフォーマンスが向上します。

TruffleRubyの特徴

Truffle言語実装フレームワーク

Truffle言語実装フレームワークは、抽象構文木(AST)インタプリタを記述するためのJavaフレームワークです。このフレームワークを使用することで、言語のASTを記述し、各ノードでどのように動作するかを定義することができます。Truffle言語実装フレームワークは、GraalVMコンパイラを利用してASTインタプリタを評価し、効率的なマシンコードに変換します。

互換性

TruffleRubyは、MRIとの完全な互換性を確保することを目的としているため、MRIとの高い互換性を保ちつつ高速な実行性能を提供します。
多くの人気のあるRubyライブラリやフレームワークはTruffleRubyで問題なく動作するとのことです。
ただし、TruffleRubyは新しい技術であるため、まだ100%の互換性があるわけではないため、使用したいライブラリがTruffleRubyで動作することを確認する必要があります。

TruffleRubyのパフォーマンス

高速化のメカニズム

TruffleRubyは、Truffle言語実装フレームワークとGraalVMのJITコンパイラを活用しています。Truffle言語実装フレームワークは動的言語に特化しています。GraalVMのJITコンパイラにより実行時にコードを分析し、効率的なマシンコードへと変換します。これらの技術により従来のインタプリタ(MRI)よりもパフォーマンスの大幅な向上を実現しています。

TruffleRubyでのNativeImage

NativeImageを使用して、TruffleRubyとGraalVMコンパイラを、JVMに依存せず静的にリンクされた単一のネイティブバイナリ実行可能ファイルにコンパイルできます。JVMの必要な部分のみが含まれているため、単にjarをJVMのリソースとして使用するよりもパフォーマンスが向上することがあります。

ただし、NativeImageはすべての場合に適しているわけではなく、用途によっては適さない場合もあります。例えば、NativeImageではガベージコレクションが単純のため、一部の最適化処理が出来ず、ピークパフォーマンスが低くなることもあります。さらに追加のセットアップが必要となるので実装工数もかかります。長時間実行されるアプリケーションで高パフォーマンスを求める場合は、TruffleRubyのJVMバージョンを使用するべきです。

最適化

TruffleRubyはプロファイリングに基づいた最適化を行います。プロファイリングは、アプリケーションの実行中にメソッド呼び出しやループ回数などの情報を収集し、最適化のためのデータを提供します。これにより、TruffleRubyは実行時に最適なコンパイル戦略を選択し、効率的な実行を実現します。

まとめ

TruffleRubyは、高パフォーマンスな実行環境を提供し、GraalVMの特徴であるJITコンパイラやNativeImageを活用することで、Rubyの高速化を実現していることがわかりました。
TruffleRubyはまだ新しい技術であり、現時点では既存のRubyライブラリとの完全な互換性がない場合もあるため注意が必要です。

ただ、GraalVMは、X(旧Twitter)やFacebookなどの大手企業による採用例もあり、将来的なトレンドとして期待されています。GraalVMの成長に伴い、TruffleRubyもさらなるパフォーマンス向上や拡張性の向上が期待されます。Rubyで高パフォーマンスを求める場合、TruffleRubyの採用も一つの選択肢として検討してみてはいかがでしょうか。

参考記事

Discussion