Java VMを自作したのでその方法を書いておきます。
作ったもの
RでJava VMを実装しました。igjit/jvmrr
今のところ39個のJava VM命令を実装しており、Fizz Buzzが動きます。
Japan.R 2019での発表資料
https://igjit.github.io/slides/2019/12/jvmrr/#/
方法
1. 実装言語を決める
To implement the Java Virtual Machine correctly, you need only be able to read the class file format and correctly perform the operations specified therein.
https://docs.oracle.com/javase/specs/jvms/se11/html/jvms-2.html
クラスファイルを読めてその中の命令を実行できればJava VMを実装できるよ、とのことなので好きな言語で実装しましょう。
クラスファイルはバイナリなのでバイナリを扱う方法を確認しておきます。 Rの場合はreadBinでバイナリを読んでbitw系の関数でビット操作できます。
2. 概要を把握する
めもりーさんの資料がわかりやすいです。
3. Hello Worldを動かす
Java VM仕様を確認しつつ実装していきます。 わかんないとこあってもPHP で JVM を実装して Hello World を出力するまでを写経していけば多分なんとかなるはず。
Hello Worldまでが一番大変だと思うけど、Hello Worldが動くとまさにHello Worldって感じなのでがんばってください。
Rで書いたJava VMでhello world動いた。
— igjit (@igjit) October 22, 2019
今までやったhello worldの中で一番感動した。 pic.twitter.com/9nU4p1gRKK
4. VM命令を増やす
VM命令を実装していくとできることが増えるので面白いです。私は
- 四則演算
- forループ
- Fizz Buzz
を順に実行できるようにしていきました。
javap -c FizzBuzz.class
とかやると実行に必要なVM命令がわかります。
なぜ
Japan.Rの懇親会でなんでそんなことしたのって聞かれたんですが、理由はRでできるか試してみたかったのと、ただ単純に言語処理系を作るのは面白いからです。
Java VM作成は大変楽しい作業なのでみなさんも長期休暇に挑戦してみてください。Enjoy!