版本
- 適用於 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;
}
}
為了測試 doGeneric
對於引數 exp == 1
是否產生正確的結果,您首先需要使用不同的值執行此節點。例如,您可以使用 exp == 2
來啟動 doGeneric
特化,然後才使用 1
,此時將由 doGeneric
特化而不是 doOne
特化處理。在真實世界的程式碼中,編寫涵蓋取代其他特化的特化測試可能會更加複雜,並且會導致測試變得脆弱。生產程式碼中的變更可能會導致測試突然涵蓋不同的特化。這可能會在不知不覺中發生。
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