CleanJ
ちょっとつまり気味。アプローチを再検討する。
-
-
- -
-
ABCコードはいわばCISC的なコードなのだが、これをRISC的なコードに変換して、そこからJavaコードに変換するというアプローチの方がよいかもしれない。
今のコードは、それに近い考え方なのだけれど、一部バイパスしようとしているところがあったりして、はっきりしていないところがあるんだ。
では、RISC的コードというのはどういうものにすればいいのだろう?JavaソースコードとJavaバイトコードの両方を生成するのに適したものになるとよいのだけれど。
-
-
- -
-
ABCマシンとは違い、JVMのスタックに対する操作はスタックトップに対するものだけなので、ABCのスタックはJVMではローカル変数として表現する必要がある(少なくとも、JVMのスタックは使えない)。これは、必須の条件。
-
-
- -
-
検討中のRISCマシン(名前を付けておく方が便利だなぁ)は、型ごとにレジスタを2つずつ持っているということにするのがよいのではないかという仮定。
- Int (int): I1 I2
- Char (byte): C1 C2
- Bool (boolean): B1 B2
- Real (double): R1 R2
- Thunk/Value (Object): O1 O2
実際には、これはJVMのスタックにマッピングされるので、数の小さい側から埋めなければいけないし、レジスタのクリアという操作が必要になる。
-
-
- -
-
命令を次の種類にわける。全ての命令について、入力レジスタは0,1,2個で、出力レジスタは0,1個。
- read: レジスタにデータを読み込む。読み込み先のレジスタの指定は、型と添数字(1,2,xI,xC,xB,xR,xO)の組み合わせ
- write: レジスタからデータを書き出す。
- clear: レジスタをクリアする。
- compute: レジスタ上で計算する。
- stack operation: スタック操作
x?は、1番レジスタにデータがあるときに、それを2番レジスタに移動させて、1番レジスタにデータを読み込むことを意味する。?の部分は、最初に1番レジスタにあるデータの型。
同じ添数字のレジスタは同時に利用することはできない。
-
-
- -
-
これって、JVM以外にも有効なのかな。
MSILを調べてみる http://msdn.microsoft.com/library/ja/default.asp?url=/library/ja/cptutorials/html/il_dasm_tutorial.asp
スタック周りは.NETはJVMと同じような仕組みなんだな。
-
-
- -
-
buildの例
# build _ 3 n12 create_entry O1 3 0 "" get_desc O1 _ n12 setO 0 3 0 "" read O2 setO 3 3 0 "" popO read O2 setO 2 3 0 "" popO read O2 setO 1 3 0 "" popO create_thunk OxO fill_thunk write O1 clear O1
writeはレジスタの値を消費しないので、clearで消さないといけないと。
-
-
- -
-
うーん。これ、いいかも知れないなぁ。