GitHubでコミットログ見てればなんとなく進捗はわかるけど,ちゃんと文章として書きだしたほうがいいかなって.
簡単な説明: JVM作るって何
突然ですが,皆さん,JVM使ってますか?
僕は(明示的には)使ってません.ですが 3 Billion Devices Run Java と言うくらいですから,世の中は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とかもらえると喜びます.
以上.