JVMで動作するプログラミング言語を作るにはどうしたらよいのだろう?(5)
本人はいちお、asmを使って、クラスファイル生成したりしてみてます。
で、そのことをローカルで書いてたのだけど消えてショックを受けてます。
前回はやる気がなかったので、今回は継続するための計画を立ててみることにしました。
(5)classファイルの構造1
(6)ローカル変数を扱う。load,store命令
(7)pop,pop2,dup
(8)add,sub,mul,div,rem,neg
(9)shl,shr,ushr
(10)and,or,xor,inc
(11)cast命令
(12)cmp
(13)条件分岐retと、goto,jsr,goto_w,jsr_w
(14)tableswitch,lookupswitch
(15)return
(16)getstatic,putstatic,getfield,putfield
(17)invoke関数呼び出し
(18)new
(19)配列newarray,anewarray,arraylength,multianewarray
(20)athrow例外
(21)checkcast
(22)instanceof
(23)monitorenter,monitorexit
(24)wide
(25)breakpoint
(26)impdep1 impdep2
ていうかんじで見ていこうと思います。
途中にclassファイルの構造を何度かみたり、asmを使ってみたりもしようと思います。
一ヶ月くらいかかる勢いだなぁ。果たして続けられるのでしょうか。。。
さて、そういうわけで、classファイルの構造をざっと見てみたいと思います。
ClassFile { u4 magic;// マジックNO 0xCAFEBABE u2 minor_version; // マイナーバージョン u2 major_version; // メジャーバージョン u2 constant_pool_count; // コンスタントプールの数 cp_info constant_pool[constant_pool_count-1];// コンスタントプール u2 access_flags;// アクセスフラグ u2 this_class;// thisクラス u2 super_class;// スーパークラス u2 interfaces_count;// インターフェイス数 u2 interfaces[interfaces_count];// インターフェイス u2 fields_count; // フィールド数 field_info fields[fields_count];// フィールド u2 methods_count; // メソッド数 method_info methods[methods_count];// メソッド u2 attributes_count; // アトリビュート数 attribute_info attributes[attributes_count]; // アトリビュート }
まずclassファイルは以上のような構造になっていると、
http://java.sun.com/docs/books/jvms/second_edition/html/ClassFile.doc.html#80959
に書いてあります。
マジックNo、バージョン、コンスタントプール配列、アクセスフラグ、thisクラス、スーパークラス、
インターフェイス配列、フィールド配列、メソッド配列、アトリビュート配列
がclass情報としてあるわけです。
u4,u2はunsigned 4 byteあるいはunsignhed 2 byteの値。
cp_info,field_info,method_info,attribute_infoはそれぞれ別な構造を持っています。
マジックNoはJavaはコーヒーから名前取ってるので、0xCAFEBABEという4バイト。
マイナーバージョンとメジャーバージョンはバージョンnoを入れます。
コンスタントプールは、定数の表になっていて、数値や文字列等が入っています。
アクセスフラグはpublic,private等のアクセス属性が入ってます。
this_classは自分のクラスの名前のコンスタントプールnoが入っています。
super_classはスーパークラスの名前のコンスタントプールnoが入っています。
interfacesにはインターフェイスの名前のコンスタントプールnoが。
fieldsにはメンバ変数など、methodsには関数メンバ(メソッド)が、attributesにはソースファイルと非推奨の属性が入っているようです。