Lynx-EyEDの電音鍵盤 新館

広帯域制御屋の駄文とか

Java VMとバイトコードとマイコンの親和性は良好?

その後、Java VMをCortex-M0+マイコンのLPC812に移植しました。
詳しくは↓
LPC800にJVM載せてUARTループバック - Lynx-EyEDの電音鍵盤 新館

最近、とある事がきっかけでJVMの勉強をしています。FPGAでOISCを作りたいってちょっと前から思っていて*1その時、id:suikan 氏に「それはスタックマシンの独壇場だろう」と。
ここから脱線が始まる訳です。
FPGAでOISCを作ったは良いけど自分でコンパイラからアセンブラから作るのはメンドイし、なにせレジスタも無いスタックマシン。HW,SWの両方のバグ取りしてたら終わる気がしません。
で、いろいろ探してたらJVMが面白いと言う事に気が付きました。*2
なのですが、Javaの解説本見ても、ボクの欲しい情報はなかなか見当たりません。

で、お約束参考ブログ
【参考ブログ】
Javaバイトコードメモ(Hishidama's Java ByteCode Memo)Wikipedia::Java仮想マシン

ここの情報をもとに、CLDC準拠とかそのレベルではなく極々原始的なバイトコードを認識できるVMをマイコン(or FPGA)に載せる所から始めたら楽しそうだ、と言う訳です。

名付けてJava下層マシン(殴

とりあえず、Javaで何か書いて逆アセンブルした結果を見ようと思いました。(詳細は上記2つのサイトをご覧ください)

書いたコードはこんなの。

class hoge1{

    public static void main(String[] args){

        int n = 123;
        int m = 3;
        int t = m + n;

        System.out.println(t);
    }
}

コレをhoge1.javaとして保存して、ターミナルで

$ javac hoge1.java 

コンパイルされて、hoge1.classという中間コードになる。
実行するには

$ java hoge1
126

$ 

まぁ、当然の結果が出てきます。
アセンブルしました。

$ javap -c hoge1
Compiled from "hoge1.java"
class hoge1 extends java.lang.Object{
hoge1();
  Code:
   0:	aload_0
   1:	invokespecial	#1; //Method java/lang/Object."<init>":()V
   4:	return

public static void main(java.lang.String[]);
  Code:
   0:	bipush	123
   2:	istore_1
   3:	iconst_3
   4:	istore_2
   5:	iload_2
   6:	iload_1
   7:	iadd
   8:	istore_3
   9:	getstatic	#2; //Field java/lang/System.out:Ljava/io/PrintStream;
   12:	iload_3
   13:	invokevirtual	#3; //Method java/io/PrintStream.println:(I)V
   16:	return

}

public static void mainからがメインのコードです。1、2、3などの小さい数字はioconst命令を使って効率よく計算しようとしてるみたいです。
きょうはここまで。次回もう少し深く突っ込んでみようと思います。

*1:OISCの件はまたの機会に

*2:OISCは1命令インストラクションなのでJVMとは直接的な関係はありません