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だけを考えていればいいのではないかと思う。それ以外は、JVMやJavaライブラリの機能を利用することができるのではないか。dsについては、クラスのpublic static finalフィールドに、シンボル情報を置いておくだけでいいかもしれない。あるいは、クラス名だけで足りてしまうかもしれない。
-
-
- -
-
あ、まてよ。gsというのは、要はヒープだ。だから、これもJVMに任せていいんじゃないか?ということは、もしかして、asとbsの2つのスタックだけを用意すればおしまいか?
あと、詳しく実装を見ていないけど、bsとcsは実際には1つのヒープになっているような気がする。デバッグオプションでスタックサイズを表示させたときも、bsとcsはまとめて表示されるし。ということは、bs+csで、JVMのスタックを代用できるのではないか?
ということは、最後に残るのはasだけか。
-
-
- -
-
bsは計算用で、最終的な計算結果の受け渡しはasを利用しているみたい。それなら、まさにJVMのスタックをそのまま利用できるな。