GCとクロージャつらつら

……Delphi2009のクロージャ実装とか見ると、D言語OCamlクロージャと比べてしまって、むしろGCあったほうが有利だろこれと思えて仕方がないのでありました。
GCが無い言語で真のクロージャを実現しようとすると、いろいろあるわけです。

  • ローカル変数をスタックフレームではなくヒープに配置しなければいけない
  • ということは参照カウンタが必要
  • ということは構造化例外処理を仕掛けないといけない
  • ということはレジスタ割りつけ等の最適化が制限される

GCのある言語だとこうなる。

  • ローカル変数をスタックフレームではなくヒープに配置しなければいけない
  • でも参照カウンタなんて不要
  • ということは構造化例外処理を仕掛けなくてもいい
  • ということは普通に最適化できる

だからって勿論Delphiのような「他のソフトとも併用する対話型アプリを作る可能性が高い言語」にGCは似合わないわけで。もうちょっと上手い方法ないものでしょうか。zero-cost-exceptionはうってつけのような気もしますがOSが構造化例外を提供していてかつ複数のコンパイラが入り乱れるWindowsの環境とはちょっと噛み合いませんしねえ……。

grass.mlが速いのは、grassのクロージャやカリー化をOCamlクロージャやカリー化に直接対応させているからかな……。それに上記理由に加えてOCamlはメモリー割り当てがカウンタを進めるだけですから速かったり、grassのようなあまり巨大なアプリ書けない言語ではGCが必要になる前に終了してしまうので事実上freeなんて一切しない戦術だから速かったりとかあるんだと思います。ですからCやAdaで書き直しても速くなる気がしないです。まあ計って無いので憶測だけで書いてるんですけど。