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人日ぐらい。