コードジェネレータの実装も半ばながら、VMの実装にそろそろ入ります………。
その前に固めておかなければならない方針や仕様が多数。こりゃたいへんだじぇ_| ̄|○
kikyou.infoサーバが「ガッガッガッガッガ ガシャガシャガシャガシャ ガッガッガッガ」という異音をたてていたので、ゴミでもファンにつまったのかと思って分解清掃。
調べてみると電源ファンの軸がゆるゆるになって、ファンの枠にファンの羽根がぶつかる音でした。
電源を取り替えてメンテ終了です。
SSA形式からVMコードを生成する部分(コードジェネレータ)を書いてます。
いまのところ
var a, c;
a = 1;
do {
c = a;
a = 2;
}while(x);
f(c);
というコードから
00000 const %0, *0 // *0=void 00003 cp %1, %0 00006 const %2, *0 // *0=void 00009 cp %3, %2 00012 const %4, *1 // *1=1 00015 cp %5, %4 00018 cp %6, %5 00021 jump 00023 00023 cp %0, %6 00026 const %1, *2 // *2=2 00029 cp %2, %1 00032 cp %3, %0 00035 cp %4, %2 00038 jump 00040 00040 this %5 00042 const %6, *3 // *3="x" 00045 dget %1, %5, %6 00049 cp %7, %4 00052 cp %8, %3 00055 branch %1, 00023, 00059 00059 this %5 00061 const %6, *4 // *4="f" 00064 dget %1, %5, %6 00068 call %0, %1(%8)
というコードを吐いてくれます。ニーモニックの意味は推して知るべし。最適化を全くしてないのでひどいものですが、まずは動くものを作ることを優先しようと思います。最適化の機構は後からでも十分つけられるので。
ちなみに TJS2 だとこんなに短いです。
00000000 cl %-3 00000002 cl %-4 00000004 const %1, *0 // *0 = (int)1 00000007 cp %-3, %1 00000010 cp %-4, %-3 00000013 const %1, *1 // *1 = (int)2 00000016 cp %-3, %1 00000019 gpd %1, %-2.*2 // *2 = (string)"x" 00000023 tt %1 00000025 jf 000000010 00000027 calld %0, %-2.*3(%-4) // *3 = (string)"f"
うーむ、前にTJS2はほとんど最適化を行ってないと書いてしまいましたが、そういえば覗き穴最適化はいくらかは行うようになっていたし、いろいろ苦労したなぁと今更になって思い出しました。TJS2は機構が単純でしかもほぼon the flyでコードを生成していたわりには結構効率的なコードを吐いてたなぁ、と。
Risseの方がよいコードを吐ける機構を導入しうるので、上記コードはさらに短くなるはずです。