なんでもセミナー

情報科学なんでもセミナー「Haskellがアセンブリになるまで」を聞いてきました。

話者の中村さんは 3 週間ほどで GHCソースコードを読んだそうです。発表もしっかりしていて、とても B3 とは思えませんでした。あと聴衆に shelarcy さんとか shinh さんとか著名な人が来ててこれもすごかったです。僕が発表した頃の内輪だけのなんでもセミナーとはまるで別物です。


詳細は発表資料が公開されることを期待しつつ、印象に残ったことだけメモ。

  • GHC の実装では type checker が desugarer より先 (参考) 。先に desugar してしまうと型エラーの表示がしにくくなるからとか?
  • 型クラスのディスパッチは Dictionary Passing Style というので行われているらしい。型クラスのメソッドはトランポリンみたいなもので、呼び出し側で関数の実体 (最終的に呼ぶべき関数) を指示してる、と理解した。簡単な場合はインライン展開とかされるっぽい。
  • 整数を受け取ったり返したりする関数を定義したとき、Int か Integer かとか型注釈してやらないと Dictionary Passing Style にコンパイルされてしまう (一般的には当たり前) 。でも、その関数を let 節や where 節で局所的に定義し、しかもその関数が Int に対してしか使われてないような場合でも Dictionary Passing Style になることがあるとかなんとか。その理由は遅延評価絡みらしいけどよくわからなかった。というわけでもないらしい via msakai さん。単純に考えて、コード量が爆発する (ことがある) からかなぁ。
  • 中間表現の STG (Shared Term Graph) とか C-- とかの紹介。
  • State モナドが隠蔽する値を modify するとき、modify 前の値が二度と使われないとわかるときは、新しいオブジェクトを作らず元のオブジェクトを破壊的に更新するような最適化はないですか。と聞きたかったけれどうまく説明できなかった。ていうか自分で調べろって感じ。
  • 別ファイルに書かれた map 2 つを fusion することがあるか。分割コンパイルしないならできそう (笑)