C--とcmm

C--ってGHC専用の中間言語だと勝手に思ってた。
http://www.cminusminus.org/によると

コンパイラ書く時に、機械語の生成どうする?自前でコードジェネレータ書くのは、めがっさ大変だし(いやまあ移植性を考えないでプラットフォーム決めうちならそうでもないかも)、VPO(って何?)やMLRISC(って何?)やgcc backendを利用するには、こいつらは巨大で複雑できちんとドキュメント化されてない上に、MLRISCを使うにはフロントエンドをMLで書かねばならないし、gccを利用するにはフロントエンドをCを書かねばならないとか、問題は山積み。あるいは、レジスター、末尾再帰最適化、computed gotos(って何のことだろう?)、GC、効率的な例外処理etcに関する沢山の結果を必要としないんなら、Cコードを生成するのもいいかもね。

でも、portableなアセンブリ言語があれば、もっとhappyになれんじゃね?そんな言語があれば高レベル言語のコンパイラとretargetableな最適化コード生成器のよい橋渡しになり、フロントエンド書きとコードジェネレータ書きは容易く協力できる。C--はそんな言語だ

とか、そんな感じらしい。まあ言ってることは、割とみんな思ってそうなことだよな〜


C--に関する最初の論文は、Simon Peyton Jones等によるC-: A Portable Assembly Languageらしい。けど、これは、コンセプトだけで、大したことは書いてないので、C--: a portable assembly language that supports garbage collectionとか読むほうがいい(一本だけ選ぶならこれにしろと論文リストに書いてあった)。C--自体は、GCとか、そういう機能は一切持ってなくて、そうしたruntimeのためのインターフェースのみがあるらしい。なので、runtimeの実装は自力でやらんといかん模様(それって、まあまあ大変な気が)。そういう風になってるのは、例外処理とか、GCとか、どういう設計にするのがいいかは言語によって違うから、ということらしい。HaskellやMLやPrologJavaバイトコードに落としてJVMで走らせても、どう控えめに見てもパフォーマンスがいいとはいえない、結局JVMJavaのためのVMだよねとか(そうなのか・・・)


GHCcmmの説明はGHC Commentaryに割と詳しく載ってる。cmmは、GHCのC--実装ですとか書いてあるけど、全然C--じゃないような。C--は、まだCに近いっぽいけど(Quick C--のインストールが面倒で一個も動かしてないけど)、cmmはreturnもないし、関数も原則として引数取れなくて単なるラベルだし、処理はレジスター(Sp,Hp,R1,R2,..,L1,..)の操作を介して行うし、要するにSTGマシンのアセンブラという感じな。