Improving the Ideal Graph Visualizer for better comprehension of Java’s main JIT compiler

原文はこちら。
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
IGV before and after JDK 17 improvements
IGV before (left) and after (right) JDK 17 improvements

これらの改善点は、すでに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の改善は、大規模で複雑なコンパイラの内部を学ぶ上で、コンパイラ自体をハックするよりも楽しく、また怖くない方法です。

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト /  変更 )

Google フォト

Google アカウントを使ってコメントしています。 ログアウト /  変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト /  変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト /  変更 )

%s と連携中