TinyExpression v1.4.15 は 6 つの実行バックエンドを提供します。本ドキュメントでは各バックエンドの違い、選択契約、推奨使用法を説明します。
| バックエンド | クラス | ステータス | 戦略 |
|---|---|---|---|
JAVA_CODE |
JavaCodeCalculatorV3 |
プロダクション | パース → Java 生成 → javac → ロード → 呼び出し |
JAVA_CODE_LEGACY_ASTCREATOR |
LegacyAstCreatorJavaCodeCalculator |
凍結(リファレンス) | 上記と同様だがリファクタ前 AST クリエイター使用 |
AST_EVALUATOR |
AstEvaluatorCalculator |
プロダクション | パース → AST → ツリーウォーキングインタープリタ |
DSL_JAVA_CODE |
DslJavaCodeCalculator |
generated-only | P4 AST → 型付き Java エミッタ → javac |
P4_AST_EVALUATOR |
P4AstEvaluatorCalculator |
PRIMARY(P4) | UBNF パーサー → P4 AST → 型安全エバリュエータ |
P4_DSL_JAVA_CODE |
P4DslJavaCodeCalculator |
移行ターゲット(P4) | UBNF パーサー → P4 AST → DSL Java エミッタ |
現行プロダクション JavaCode ベースライン。
- クラス:
JavaCodeCalculatorV3 - 変更ポリシー: JavaCode パスへの新機能追加の主要ターゲット
- 動作: 式を Java ソースコードに変換 →
javax.tools.JavaCompilerでインメモリコンパイル →MemoryClassLoaderでクラスをロード →CalculationContextで呼び出し - 利点: コンパイル後の実行は最速。JIT 最適化の恩恵を受ける
- 欠点: 初回呼び出し時にコンパイルオーバーヘッドあり。インメモリ
javacが必要
リファクタ前の比較ベースライン。
- クラス:
LegacyAstCreatorJavaCodeCalculator,LegacyOperatorOperandTreeCreator - 変更ポリシー: 凍結 — 最小限の互換性パッチのみ許容
- 用途:
JAVA_CODEのリファクタが同一の結果を生成することを検証するリグレッションベースライン
生成 P4 AST の走査実行。
- クラス:
AstEvaluatorCalculator - 失敗契約: P4 のパースまたは評価に未対応箇所があれば明示的に失敗し、手書き評価器や Java コード生成器へ切り替えない
- 変更ポリシー: 生成 AST カバレッジの拡張が主要ターゲット
- 利点: コンパイルオーバーヘッドなし。軽量デプロイに適する
- 欠点: ホットパスでは
JAVA_CODEより若干遅い。未対応構文は明示エラーになる
generated-only DSL Java エミッタ。
- クラス:
DslJavaCodeCalculator - 変更ポリシー: ネイティブ DSL Java エミッタのカバレッジ拡張の移行ターゲット
- 動作: 生成 P4 AST へマップし、
P4TypedJavaCodeEmitterだけで Java を生成する。未対応構文は明示的に失敗する - ランタイムマーカー:
_tinyDslJavaNativeEmitterUsed = true_tinyExecutionImplementation = p4-typed-emitter_tinyExecutionBridgeImplementation = false
型安全な UBNF 生成パーサーと AST 評価。
- クラス:
P4AstEvaluatorCalculator - 変更ポリシー: P4 文法カバレッジの拡張。LSP/DAP のリファレンス実装
- 動作: UBNF 生成の
TinyExpressionP4Parsersで sealed interface P4 AST を生成 →P4TypedAstEvaluatorで評価 - AST_EVALUATOR との違い: LSP/DAP での正規表現なし。完全に
instanceofベースのディスパッチ。コンパイル時の網羅性 - 制限: P4 文法外の構文は明示的に失敗する
型安全な UBNF 生成パーサーと DSL Java コード生成。
- クラス:
P4DslJavaCodeCalculator - 変更ポリシー: 完全生成 DSL エバリュエータへの移行ターゲット
- 動作: P4 パーサー → P4 AST → DSL Java エミッタ
- グローバル既定値:
FormulaInfoAdditionalFields.setExecutionBackend(...)— 初期値はJAVA_CODE - 式ごとの上書き:
FormulaInfoのexecutionBackendまたはbackendキー - 実装割り当て:
CalculatorCreatorRegistry.forBackend(ExecutionBackend)
| エイリアス | バックエンド |
|---|---|
token |
JAVA_CODE |
legacy-astcreator, ootc |
JAVA_CODE_LEGACY_ASTCREATOR |
ast |
AST_EVALUATOR |
dsl-javacode |
DSL_JAVA_CODE |
p4-ast, p4-ast-evaluator |
P4_AST_EVALUATOR |
p4-dsl-javacode, p4-dsl-java-code |
P4_DSL_JAVA_CODE |
6 つすべてのバックエンドは同一の入力に対して等価な値を返す必要があります。
- サポートコーパスに対して全 6 バックエンドが等価な値を返す(MUST)
AST_EVALUATORとDSL_JAVA_CODEは手書き fallback 実装を呼ばない(MUST)P4_AST_EVALUATORとP4_DSL_JAVA_CODEは他の 4 バックエンドと一致する(MUST)- P4 文法でカバーされていない式は明示的に失敗する(MUST)
DAP デバッグモードで実行すると、以下の変数が公開されます:
| 変数 | 説明 |
|---|---|
parity.JAVA_CODE |
JAVA_CODE バックエンドの結果 |
parity.AST_EVALUATOR |
AST_EVALUATOR バックエンドの結果 |
parity.P4_AST_EVALUATOR |
P4_AST_EVALUATOR バックエンドの結果 |
parity.equalAll |
全 6 バックエンドが一致する場合 true |
すべてのバックエンドが実行後にこれらのコンテキストマーカーを設定します:
| マーカー | 説明 |
|---|---|
_tinyExecutionBackend |
使用されたバックエンド名 |
_tinyExecutionMode |
実行モード |
_tinyExecutionImplementation |
実装バリアント |
_tinyExecutionBridgeImplementation |
generated-only バックエンドでは常に false |
- グローバルデフォルトを
JAVA_CODEのままにする - 特定の式を
P4_AST_EVALUATORでテストしてカバレッジを確認 - 式ごとに上書き:
backend:P4_AST_EVALUATOR - 完全移行前に DAP デバッグで
parity.equalAllを確認 JAVA_CODE_LEGACY_ASTCREATORは変更しない — 不変のリファレンスとして扱う
- 構文や実行時機能を追加する場合: まず
JAVA_CODEとAST_EVALUATORを更新 JAVA_CODE_LEGACY_ASTCREATORの変更は最小限に- バックエンド名を再利用してはならない(MUST NOT)
- バックエンド動作契約を変更する場合: このドキュメントとパリティテストを同時に更新する(MUST)
- P4 バックエンドはすべての言語機能をカバーしていない(段階的拡張中)
JAVA_CODE_LEGACY_ASTCREATORは凍結状態BigDecimalとBigIntegerの式内演算サポートは限定的
- architecture-ja.md — バックエンドがパーサーおよび AST 層とどう接続するか
- decisions/ADR-001-p4-primary.md — P4 を PRIMARY に昇格した理由