Concurrent Clean : CleanJ : 整理

今問題になっているのは、スタックの表現方法なのだけれど、それを整理しておく。

Real型の扱い

B-Stackやユーザー定義データに含まれるReal型の値は、2つのB値として取り扱われているのだけれど、これをJavaに置き換えたときには、double型の値を2つのintとして取り扱うことはできない。しかし、ABCコードのレベルでは、それがReal型の値であるかどうかを判断することは必ずしも容易ではない。(今の段階では、もう少し分析を進める必要がある)
なので、当面は、Double.doubleToRawLongBits()やDouble.longBitsToDouble()を使って、double値をint2つに変換して扱うことにする。おそらく、こうすることで、浮動小数点数の計算のオーバーヘッドが大きくなると思われるが、そこの改善は後回しということにする。

File型などの扱い

B-Stackには、Int,Real,Char,Boolの他に、File型やDescriptorなどのポインタ型が積まれることもある。このケースについては、環境オブジェクトにそれらを格納する配列を持たせて、それに対するインデックスを使うことで、int型の値として取り扱う。

update_a,update_b

スタック操作で、update_a, update_bという操作が頻発する。これは、スタック上の値を並べ替えるために行われる操作だけれど、これを逐一代入に置き換えるべきか?スタック上の値を並べ替える操作をJavaコード生成時に処理して代入を少なくすることは可能かもしれない。しかし、ローカルなjmpの際にスタックの位置合わせを行うところが面倒になる。
なので、当面は、update_a, update_bは逐一代入に置き換えることにする。
ローカルなjmpの位置合わせのところは、まだ少し分析が足りない段階なので、逐一代入の方式で変換した結果を観察してから、より効率のよい方法に書き換えることにする。