概要
- SpiderMonkeyのIonコンパイラ用に 新しい可視化ツール を開発
- インタラクティブなグラフ で最適化プロセスを詳細に観察可能
- Graphviz等の従来ツールの 課題を解消
- 独自のレイアウトアルゴリズムを 1000行未満で実装
- 本記事では アルゴリズムの設計思想と全体像 を解説
SpiderMonkey Ionコンパイラの可視化ツール刷新
- SpiderMonkeyの最適化コンパイラ Ion の処理を インタラクティブなグラフ で可視化
- JavaScriptのテストコードを記述し、 即座にグラフ生成・操作 が可能
- グラフ上で クリック&ドラッグで移動、Ctrl+スクロールでズーム 操作
- スライダーで最適化過程を段階的に表示、ブロックや命令の追跡も容易
- グラフレイアウトの安定性 を重視、ブロックサイズや構造変化にも強い設計
従来ツールの課題と独自アプローチ
- 以前は iongraph(Python+Graphviz) でPDF出力、視認性や操作性に問題
- Graphvizは ノード配置が直感的でなく、安定性に欠ける
- 例:return文がループ本体より上に表示されるなど、 ソース構造と乖離
- 小さな変更で グラフ全体が大きく変化、比較や追跡が困難
- 制御フローグラフ(CFG) 特有の制約(ループ構造、単一エントリ等)を活用可能
- 静的PDFでは探索が困難、インタラクティブな操作性が求められる
- GraphvizやMermaidの代替として 独自レイアウトアルゴリズムを開発
レイアウトアルゴリズム設計思想
- Sugiyamaレイアウトアルゴリズム(階層的グラフ描画)を SpiderMonkey用に最適化
- CFGの特性を活かし、 以下の簡略化・工夫を導入
- ループのバックエッジは明示的に扱い、 サイクル処理を単純化
- レイヤー分けで ループ後のブロックを下方に配置、可読性向上
- エッジ交差最小化よりも安定性を優先、分岐順序の一貫性を保持
- ループ構造は ツリー状に整理、ネスト関係を明確化
- 1000行未満のJavaScript実装、効率的かつ高品質な出力を実現
iongraphレイアウトアルゴリズムの流れ
-
ステップ1:レイヤー分け
- 各基本ブロックを 「レイヤー(水平トラック)」 に分類
- ループの高さ(レイヤー数)を追跡、 ループ内外の位置関係を調整
- ループ外へのエッジは ループ内容処理後にレイヤー付与
- 実装例(擬似コード):
layerBlock(block, layer = 0)で再帰的にレイヤー割当- ループヘッダや親ループの高さも同時に更新
- ループ外エッジは一時保留、ループ処理後に再帰
-
ステップ2:ダミーノード生成
- エッジが複数レイヤーを跨ぐ場合、 ダミーノードを挿入
- 下向きダミーは左、上向きダミーは右に配置し、 一貫した流れ を実現
- 同一宛先へのエッジは ダミーノードを統合 し、視覚的ノイズを低減
-
ステップ3:エッジの直線化
- ノード配置を調整し、 エッジをできるだけ直線的に配置
- ループヘッダ右側へのインデント、親子間の整列を複数パスで実施
- 重複ノード発生時は右方向にずらすなど、 重なりを自動回避
- ダミーノードも 直線化処理に完全参加、複雑なループも整理
- 上下方向の「コーミング」処理で 揺れの少ないグラフ を実現
まとめと今後
- 独自アルゴリズムにより、 安定・高品質なグラフ可視化 を実現
- インタラクティブな操作性 で、最適化過程の理解・デバッグが容易
- SpiderMonkey固有の制御フロー特性 を最大限に活用した設計
- 今後も デモや実装詳細 の公開を予定、さらなる改善を継続