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命令を使って効率よく計算しようとしてるみたいです。
きょうはここまで。次回もう少し深く突っ込んでみようと思います。