Hello, world レベルの JVM を作った
Java エンジニアなら JVM を実装してみたほうがいいなぁ、ということで簡単に。
- Class file の仕様を呼んで
data class
に詰め込んでいく。 - 実行してく
の2ステップで進めていけば OK.
class file の読み込み
バイナリファイルなので、DataInputStream とか使って読んでいけば OK。
https://qiita.com/mima_ita/items/a42f3f016a411627bd7a#constant_methodref
クラスファイルの中身は
- magic word(0xCAFEBABE)
- minor version, major version
- constant pool
- access flags
- this class
- super class
- interfaces
- fields
- methods
- attributes といったところ。
実行フェーズ
普通の VM を実装していけば OK。
stack, program counter とかを持った普通の VM を作る。 Java は普通の VM と違って、stdout に書く命令が VM レベルで実装されていないんで、そのへんもランタイムとしてロードしておく必要がある。
実装
https://github.com/tokuhirom/picojvm
というわけで、Hello, world がなんとなく動くところまで実装したのがこちらです。 だいたいここまでで2人日ぐらい。