published on

自作JVMの進捗を書くところ

GitHubでコミットログ見てればなんとなく進捗はわかるけど,ちゃんと文章として書きだしたほうがいいかなって.

簡単な説明: JVM作るって何

突然ですが,皆さん,JVM使ってますか?

僕は(明示的には)使ってません.ですが 3 Billion Devices Run Java と言うくらいですから,世の中はJVMに支えられて動いているんでしょう.

だとしたら,どうしますか?

JVMを一から作ってみたくなりますよね?

作り始めた動機は,これが全てです.

現状

  • 以下の情報は 2018/Dec/29 時点での情報です.

どれくらい実用的なの

ちょうど今日で,作り始めてから一週間です.実用的なものなんて作れるわけ無いです.

じゃあどれくらい動くの

  • javacを使って作ったクラスファイルを直接実行できる.
    • == クラスファイルの読み込み自体は(実装してない部分もあるけど)だいたいOK
  • 地道にJVMの命令を実装している.今は約70命令実装済み.
  • JDKの提供してくれるSystem.out.printlnとかはまだ読み込んで利用することができない.(命令が実装できてないので)
    • なので自作した.nativeなメソッドとして実装.以下実装済み
    • System
      • static final PrintStream outがあるだけ
    • PrintStream
      • println(int)
      • println(double)
      • println(String)
    • String
      • valueOf(int)
    • StringBuilder
      • append(int)
      • append(String)
      • toString()
    • Object
      • 形だけだけど.

いくつかサンプル

以下のコードはぜんぶ動く(はず)

  • static {}を使った初期化ができる.System.outを作るときに必要だった.
  • もちろん,ただのコンストラクタもあるよ.
class A {
    public static final int x;
    static {
        x = 123;
    }
    A() {
        System.out.println("constructor");
    }
}
  • classはちょっとした構造体として使うくらいの用途なら大丈夫.
class Point {
    int x, y;
    public void show() {
        System.out.println("x = " + x + ", y = " + y);
    }
}
  • こういう浮動小数点数の演算もだいたいできる.
public static double arctan(double x) {    
  double ret = 0.0;                        
  double sig = x;                          
  double sqx = x * x;                      
  for (int i = 0; sig != 0.0; i++) {       
    ret += sig / (double) (i + i + 1);     
    sig = -sig * sqx;                      
  }                                        
  return ret;                              
}

まあ詳しくは,./examplesをご覧ください.

その他

技術的な詳細はQiitaにゆっくりと書いていこうと思っています.

issueとかもらえると喜びます.

以上.