原文はこちら。
The original article was written by Roberto Castañeda Lozano (Senior Member Of Technical Staff at Oracle).
https://robcasloz.github.io/blog/2021/04/22/improving-the-ideal-graph-visualizer.html
この最初のエントリでは、JavaのメインのJITコンパイラの内部動作を可視化するためのツールと、このツールが現在および潜在的なユーザーにとってより有用になるように進めている作業をご紹介します。
Making sense out of a large, complex JIT compiler
プログラムの理解は、大規模で複雑なソフトウェアシステムを維持する上での主な課題の1つです。C2(Java参照実装であるOpenJDKのメインJITコンパイラ)を数ヶ月間使いこなそうと苦労してやってきた私が言うのですから間違いありません。幸いなことに、C2のような最適化コンパイラは、コンパイル中のコードの明確な表現、すなわち中間表現(IR)を中心に設計されていることが多いです。
Proceedings of the Java™ Virtual Machine Research and Technology Symposium (JVM ’01)
http://www.usenix.org/events/jvm01/full_papers/paleczny/paleczny.pdf
Thinking About Intermediate Representations
http://cr.openjdk.java.net/~jrose/draft/code-media.html
IRの構造と主な不変量を理解することは、多くの場合、コンパイラ自体を理解するための入り口となります。Eric RaymondはFred Brooks(「The Mythical Man-Month(人月の神話)」の著者)の言葉を借りてこう言いました。
“Show me your code and conceal your data structures, and I shall continue to be mystified. Show me your data structures, and I won’t usually need your code; it’ll be obvious”.
The Cathedral and the Bazaar
(コードを示してデータ構造を隠すとよくわからないままだが、データ構造を見せてくれれば、通常はコードは不要だ。コードはそれで明らかだ)
http://www.catb.org/~esr/writings/cathedral-bazaar/
[訳注]言葉を借りた「人月の神話」の表現は以下です。
Show me your flowcharts and conceal your tables, and I shall continue to be mystified. Show me your tables, and I won’t usually need your flowcharts; they’ll be obvious.
Ideal Graph Visualizer is our friend
C2を維持・改善する私たちにとって幸運なことに、C2のさまざまなコンパイルフェーズを通じてプログラムのIRを探索するツールが用意されています。それがIdeal Graph Visualizer (IGV)です。
Ideal Graph Visualizer
https://github.com/openjdk/jdk/tree/master/src/utils/IdealGraphVisualizer
IGVは「視覚的」であるだけでなく、インタラクティブでもあり、C2のIRの中核をなす複雑なグラフを、数回のマウスクリックで解きほぐすことができます。2007年にThomas Wuerthingerが修士論文の一環として作成したIGVは、現在では、私のようなC2の新人から経験豊富なエンジニアにまで幅広く利用されています。IGVを使用して時間を節約すれば、C2自体の改良にもっと時間をかけることができます。
Visualization of Program Dependence Graphs
https://ssw.jku.at/Research/Papers/Wuerthinger07Master/Wuerthinger07Master.pdf
Improvements in JDK 17
IGVが提供する価値を考慮して、経験豊富なC2エンジニアと新しいC2エンジニアの両方のニーズをより良くサポートできるように、最近ツールの改善に着手しました。その他の改善点がある中で、以下の改善を盛り込んでいます。
| 頻繁に発生するクラッシュの修正 | 8259984: IGV: Crash when drawing control flow before GCM #2607 https://github.com/openjdk/jdk/pull/2607 |
| ビルドプロセスの簡素化 最新のJDKバージョンのサポート | 8264795: IGV: Upgrade NetBeans platform #3361 https://github.com/openjdk/jdk/pull/3361 |
| IRグラフ内の特定のノードの検索の容易化 | 8260581: IGV: enhance node search #2285 https://github.com/openjdk/jdk/pull/2285 |
| IRのさまざまな側面に焦点を当てるためのより直感的なカラーリングスキームとデフォルトフィルタの導入 | 8261336: IGV: enhance default filters #2499 https://github.com/openjdk/jdk/pull/2499 |
| その他の改善点 | https://github.com/openjdk/jdk/pulls?q=IGV+in%3Atitle+author%3Arobcasloz |

これらの改善点は、すでにOpenJDKのメインリポジトリに登録されており、JDK 17にも搭載される予定です。IGVは内部開発ツールであり、通常は仮想マシンと一緒に配布されることはありませんが、試してみたい方のために、非常に簡単に構築できるようにしました。
openjdk/jdk
https://github.com/openjdk/jdk
JDK 17
https://openjdk.java.net/projects/jdk/17/
Building and Running
https://github.com/openjdk/jdk/blob/master/src/utils/IdealGraphVisualizer/README.md#building-and-running
Future work
将来的には、IGVがサポートしている機能を統合するとともに、新しいユースケースでIGVを拡張していきたいと考えています。さまざまな組織の多数のC2エンジニアと話した結果、IGVを改善するための関心とアイデアには事欠かないことが明らかになりました。例えば、繰り返し出てくるテーマには以下のようなものがあります。
コンパイル段階でIRノードの近傍を探索および追跡する(”bottom-up exploration” ボトムアップ探索)ための優れたサポートをIGVは提供しているが、トップダウンの探索のためにコンパイル中のプログラムの全体的な構造やコンポーネント(ループなど)をもっとうまく提示できるだろう。
Getting involved
IGVを使ったことがあるならば、ツールの使用感や改善点などをぜひお聞かせください。さらに、改善作業に参加したい場合は、JDK Bug Systemでの問題の報告から、実際にIGVの改善タスクを担当するまで、やるべきことはいつも存在します。
JDK Bug System
https://bugs.openjdk.java.net/
これらのタスクのうちstarterと書かれたものは、OpenJDKを学び貢献したいと考えている新人に特に適しています。IGVの改善は、大規模で複雑なコンパイラの内部を学ぶ上で、コンパイラ自体をハックするよりも楽しく、また怖くない方法です。