中間コードのフォーマットを考える
なんとなくパーサーができてきました。既に、葵の中間コードのニーモニックは決まっていたのですが、具体的な書き出しフォーマットに関しては、ちょっと悩んでいます。
というのも、葵は普通のスタックマシンなので、特に悩む部分はないように思うのですが、バイナリの読めないFlash Player7を対象にして動かすことを考えると、データ形式をバイナリにせず、適当なテキスト形式のフォ−マットにしておくのもありかなぁと思っているのです。
今、いくつか考えているのは以下の通り。
- アセンブラ形式
- JSONテキスト形式
- S式
- base64バイナリ形式
- アスキー限定バイナリ形式
- 中間コードを何とかテキストで表せる範囲に限定して表現する方法。長所:サイズがそこそこ小さい。短所:フォーマットを細かく考えたりいろいろ工夫が必要。
試しに、S式で書いてみました。(Lispは詳しくないので変だったらすみません。)
(code (header (irtype "aoi") (version 1000) (maker "kujira")) (ir (nop) (const_int 300) (store VAR1) (callapi "print")) )
美しい!ただ、JSONと本質的には変わらないかも...
読みやすさ、汎用性を考えて、JSON形式にしたいのですが、中間コードのサイズが、ものすごく大きくなってしまうのが問題です。
そこで、JSON形式を採用しつつ、冗長になってしまう部分を短縮表記するような形式を採用しようと思います。
JSONなら既にFlash用のライブラリがあるので、パーサーを書く必要もなしです。
なんとなくのイメージですが以下のような感じです。
;aoi ir example {type:aoi,ver:1000,maker:aoic, string_resource:["hello","test","boo"], ir:"i3,i5,+,=0,@0" }
中間コードの表記(ir)は文字列にして、ニーモニック1文字+引数の形にします。
例えば、ニーモニック例("i"=整数をプッシュ、"+"=足し算、"="=代入、"@"=APIのコール)とすると、
"i3"は、3をスタックに乗せて、"i5"は、5をスタックに乗せて、"+"でスタックから3と5を降ろして足してまた乗せて...という感じです。
中間コードが一番、サイズが大きくなるので、ここを文字列にして工夫すればかなり、読み取りが楽で、そこそこ読みやすい中間コードになりそうです。