- JDK 23用 GraalVM (最新)
- JDK 24用 GraalVM (早期アクセス)
- JDK 21用 GraalVM
- JDK 17用 GraalVM
- アーカイブ
- 開発ビルド
- Truffle 言語実装フレームワーク
- Truffle ブランチ計測
- 動的オブジェクトモデル
- 静的オブジェクトモデル
- インタプリタコードのホスト最適化
- Truffleの関数インライン化へのアプローチ
- Truffle インタプリタのプロファイリング
- Truffle Interop 2.0
- 言語実装
- Truffleを使った新しい言語の実装
- Truffle 言語と計測器の Java モジュールへの移行
- Truffle ネイティブ関数インターフェース
- Truffle インタプリタの最適化
- オプション
- オンスタック置換
- Truffle 文字列ガイド
- 特殊化ヒストグラム
- DSL 特殊化のテスト
- Polyglot API ベースの TCK
- Truffleのコンパイルキューへのアプローチ
- Truffle ライブラリガイド
- Truffle AOT 概要
- Truffle AOT コンパイル
- 補助エンジンキャッシング
- Truffle 言語セーフポイントチュートリアル
- 単態化
- 分割アルゴリズム
- 単態化のユースケース
- ポリモーフィック特殊化のランタイムへの報告
Truffle DSL 特殊化のテスト
このドキュメントでは、Truffle DSL 特殊化をテストするためのツールについて説明します。
コンパイルモードのみのスローパス特殊化 #
このガイドでは、以下の例を使用します。
abstract class PowNode extends Node {
public abstract double execute(double a, int exp);
@Specialization(guards = "exp==1")
double doOne(double a, int exp) {
return a;
}
@Specialization(replaces = "doOne")
int doGeneric(double a, int exp) {
double res = 1;
for (int i = 0; i < exp; i++)
res *= a;
return res;
}
}
引数 `exp == 1` に対して `doGeneric` が正しい結果を生成することをテストするには、まずこのノードを異なる値で実行する必要があります。たとえば、`exp == 2` を使用して `doGeneric` 特殊化をアクティブにし、その後 `1` を使用すると、今度は `doOne` 特殊化ではなく `doGeneric` 特殊化によって処理されます。実際のコードでは、他の特殊化を置き換える特殊化をカバーするテストを作成することははるかに複雑になり、脆弱なテストにつながります。本番コードの変更により、テストが突然異なる特殊化をカバーする可能性があります。これは気づかれずに簡単に発生する可能性があります。
Truffle DSL は、「ファストパス」特殊化 (他の特殊化によって「置き換えられる」特殊化、この例では `doOne`) を無視するモードを提供します。これにより、同じテストを実行することでテストカバレッジを簡単に増やすことができ、今度は異なるコードパスをカバーできるようになります。
`mx` で言語をビルドする場合は、追加オプションを渡します。
mx build -c -A-Atruffle.dsl.GenerateSlowPathOnly=true
リビルド後、生成されたコードは「スローパス」特殊化のみを呼び出します。 IDE がその間にソースを自動的に再コンパイルしないようにしてください。ビルドの一部として依存関係 (例: Truffle) をソースからコンパイルする場合、このオプションはそれらの依存関係のコードにも適用されることに注意してください。フィルターを使用して、このオプションを一部のクラスにのみ適用することを選択できます。
mx build -c -A-Atruffle.dsl.GenerateSlowPathOnly=true -A-Atruffle.dsl.GenerateSlowPathOnlyFilter=org.my.truffle.language.package