Concurrent Clean : ABCマシン(10)

[id:lethevert:20060420:p1]
jasminコードに変換しようと思っていたのだけれど、jasminコードを見ているうちにJavaコードを生成する方が、変換器の実装が楽になるのではないかと思った。とりあえず、プロトタイピングには、Javaコードを生成する方向でいこうかな?
と思ったけれど、やっぱりjasminを使うことにする。Javaアセンブラに一対一で対応するような書き方をすると、吐き出すコードが非効率すぎるみたい。
と思ったけれど、Cleanの遅延評価を取り扱うために、関数のエントリーポイントのアドレスをやり取りする仕組みになっていて、それをポインタのないJVMで表現しないといけない。Javaだと、無名関数でラップしてやればいいのだけれど、jasminだとそういう処理は恐ろしく面倒だ。うーむ・・・

      • -

しかし、とにかく、ABCコードの意味だ。
そういえば、[id:lethevert:20051223:p1]で、ABCマシンの構成要素を書いたが、JVMに載せる場合は、gs, as, bs, dsだけを考えていればいいのではないかと思う。それ以外は、JVMJavaライブラリの機能を利用することができるのではないか。dsについては、クラスのpublic static finalフィールドに、シンボル情報を置いておくだけでいいかもしれない。あるいは、クラス名だけで足りてしまうかもしれない。

      • -

あ、まてよ。gsというのは、要はヒープだ。だから、これもJVMに任せていいんじゃないか?ということは、もしかして、asとbsの2つのスタックだけを用意すればおしまいか?
あと、詳しく実装を見ていないけど、bsとcsは実際には1つのヒープになっているような気がする。デバッグオプションでスタックサイズを表示させたときも、bsとcsはまとめて表示されるし。ということは、bs+csで、JVMのスタックを代用できるのではないか?
ということは、最後に残るのはasだけか。

      • -

bsは計算用で、最終的な計算結果の受け渡しはasを利用しているみたい。それなら、まさにJVMのスタックをそのまま利用できるな。