GCとクロージャつらつら
……Delphi2009のクロージャ実装とか見ると、D言語やOCamlのクロージャと比べてしまって、むしろGCあったほうが有利だろこれと思えて仕方がないのでありました。
GCが無い言語で真のクロージャを実現しようとすると、いろいろあるわけです。
- ローカル変数をスタックフレームではなくヒープに配置しなければいけない
- ということは参照カウンタが必要
- ということは構造化例外処理を仕掛けないといけない
- ということはレジスタ割りつけ等の最適化が制限される
GCのある言語だとこうなる。
- ローカル変数をスタックフレームではなくヒープに配置しなければいけない
- でも参照カウンタなんて不要
- ということは構造化例外処理を仕掛けなくてもいい
- ということは普通に最適化できる
だからって勿論Delphiのような「他のソフトとも併用する対話型アプリを作る可能性が高い言語」にGCは似合わないわけで。もうちょっと上手い方法ないものでしょうか。zero-cost-exceptionはうってつけのような気もしますがOSが構造化例外を提供していてかつ複数のコンパイラが入り乱れるWindowsの環境とはちょっと噛み合いませんしねえ……。
grass.mlが速いのは、grassのクロージャやカリー化をOCamlのクロージャやカリー化に直接対応させているからかな……。それに上記理由に加えてOCamlはメモリー割り当てがカウンタを進めるだけですから速かったり、grassのようなあまり巨大なアプリ書けない言語ではGCが必要になる前に終了してしまうので事実上freeなんて一切しない戦術だから速かったりとかあるんだと思います。ですからCやAdaで書き直しても速くなる気がしないです。まあ計って無いので憶測だけで書いてるんですけど。