* ES-VMバイトコード用のコンパイラ #1 -(by [[K]], 2020.06.29) ** (1) -最初にWindows用、x86(32bit)用のコンパイラをできるだけ手抜きで書いてみよう。 -性能はそれなりにしかならないけど、でもとにかく早く作れる。 -そして後日、本気でまともなやつを作ればいい。 -まず原則として、コンパイラの中で方針が一貫していれば、他に規定される規約はない。だから自由に作れる。 ** (2) -関数呼び出し規約など --evdecl ---esvm間で普通に用いられる呼び出し規約(コンパイラで決めていい) ---基本としてはreturn値以外は一切の実レジスタを破壊しない。voidなら何も破壊しない。 ---return値が一つの実レジスタで表現できないビット幅の場合、追加の第一引数としてポインタを要求する。そのポインタを使って結果を返す。 --cdecl_w32 ---Windowsのx86(32bit)の標準的な呼び出し規約に準ずる ** (3) サンプルコード -chars evdecl void chars() { int8 i; i = 0x20; lp: putchar(i); i++; if (i != 0x7f) goto lp; return; } // バイトコードで書くと・・・ [01(func-simple)] [17 00 2c] [01] [05 f00 00] [14 00 21] [21 00 2f 00] [3f(ret)] [1] 970bc 1 5ef000 940a1 a10af0 [bf(ret)] : (hh4a)中身は11.5バイト、ヘッダフッタは1.5。合わせて13バイト。 ** (4) 進捗 -[2020.07.13] --(1)とりあえずcharsのバイトコードをx86(32bit)の機械語にコンパイルしてJIT実行できるようになりました。 --(2)同じくx86(64bit)の機械語にコンパイルしてJIT実行できるようになりました。 --(3)さらにDOSのCOMファイルを出力することもできるようになりました。 -[2020.07.14] --(1)ES-VMバイトコードから「はりぼてOS」の.hrbファイルを生成することもできるようになりました。