Kengo's blog

Technical articles about original projects, JVM, Static Analysis and TypeScript.

Java仮想マシンの教育用シミュレータを実装しました

JVM内部の挙動、特にframeやoperand stackやconstant poolについて人に伝えるためのツールが欲しいと考えていました。高速で省メモリなコードを書いたりマルチスレッドプログラミングしたりするには(Javaヒープの使い方と並んで)役立つ知識ですし、Scalaなどの"JVM言語"が脚光を浴びている今だからこそJVMそのものに対する理解を深めることに意義があると考えたためです。
しかしこのへんの情報には決定版と呼べる日本語ドキュメントもなく*1、いちいち紙やホワイトボードにスタックの絵を描いて説明しないと理解を得にくい状況だと認識しています。もちろんJVM仕様書を読んでもらえれば話が早いのですが、あれだけの量を喜々として読む人はそうは居ないわけで。


ということでoperand stackやlocal variableなどJVM内部の挙動を観察できるシミュレータを実装しました。

例えば以下のようにjava/lang/System/outとLjava/io/PrintStream;を指定してgetstaticを実行すると……
f:id:eller:20110322203607p:image
なんということでしょう!operand stackにLjava/io/PrintStream;型のjava/lang/System/outが積まれるということが目で見えるわけです。
f:id:eller:20110322203725p:image
どんな処理が行われたかはシミュレーションを観察すればわかりますが、「そもそもスタックってなに」状態な方でもログを見て適宜ググるといった使い方ができるようになっています。親切設計。
f:id:eller:20110322212353p:image


ということで実装しましたが……わ、わかりにくい!
型の表現にClassファイルの内部表現をそのまま使っているということも一因だと思いますが、それ以上にまだ「わからない人は何がわからないからわからないのか」を考え抜けていないのが大きいように思います。JVMに詳しくない人が1人で学習するためのツールにはなりきれず、詳しい人がそうでない人に教えるためのツールにとどまっている感じです。うーんおしい。
しかし教育・啓蒙用のツールにはなっていると思うので、有識者(?)の皆様にはぜひ使っていただきたいと思います。そして機能不足やデザイン不足が目についたら、適当にforkして改変していただけるとありがたいです。

*1:個人的にはhttp://www.ne.jp/asahi/hishidama/home/tech/java/bytecode.html と http://www.javainthebox.net/publication/20100806JVMseminar/stackmachine.html がおすすめ。他にあればぜひ教えてください!