Haskell がアセンブリになるまで @なんとかセミナー

寝坊して14時出社で社内テックトークとか聞き逃しておきながら16時半に消えるとかどうなんかね…とか思いつつ、行かないとこうかなぁと思ったけどやっぱり行った。で面白かったです。話者の id:MaD さんありがとうございます。 GHCコンパイラの作業の概略ということで、日本語としてはたぶん割とレアな話題の資料なのでぜひぜひ公開を。

http://pira.jp/nandemo/wiki.cgi?page=62

詳しい内容は mame さんとかにおまかせで。

http://d.hatena.ne.jp/ku-ma-me/20071022/p1

色々謎とか。ぶっちゃけよくわかってない。

  • type check => desugar

desugar が type check より先ってのは私もなんかわりとびっくりだったんだけど、でもまぁ GHC の言う desugar ってのはなんか他の言語ならあんまり desugar って言わんような気がするところまで desugar って言うんだなーとかわかったのでそれはいいんだけど。でも、

 main = print (3 + 2 + 1)

とかを -dump-tc とかで見てみると

 main = print ((3 + 2) + 1)

とかになっていて、 (+) ((+) 3 2) 1 とかにすることもなく型チェックとかしてるのは正直何考えてるねんと思わなくもないようなというかたぶんつまり GHC って、オリジナルのコードは残さず AST 作る→型検査→これ以降はコンパイルエラーは無い、って手続きで処理してて、オリジナルのコードの行情報とか残ってないからエラー時にオリジナルのコードが比較的残ってる最初の段階で型チェックしないといけないのかなぁとかそんなことを妄想しました。実際なんか

 print (3 + 2 + "a")

とかするとエラーメッセージには ((3 + 2) + "a") とかなっててオリジナルのコードと微妙に違うんすねとかなんとか。どうせちょっとはオリジナルのコードが失われちゃうんだから、このくらいは先に軽く desugar しつつ元の行情報とかを記憶した AST 作る方がいい気がするんだけどうーん知らん。

  • C--

GHC は -via-C か -O をつけると C を経由するらしい。で、それは別に GHC がやってるわけじゃなくて、一旦 C-- にしてから、 C か ASM のどっちかになるらしい。 C-- => C っていうパスはなんか一旦高級方向に戻っててなんかすごいよなぁと思うのでした。

で C を通った場合だけ Perl のポストプロセッサが動くって理解で良いのかなー。

  • Dictionary passing style

よくわからんけど仮想関数テーブルみたいなのを渡すって理解であってるんかなぁ。そうだとするとマージする必要とか別に無いと思うんだけど。謎。質問した理由は辞書っていうから {Char: ShowChar, String: ShowString, ...} みたいなのかなーとか勘違いしたんですがたぶんこれは勘違いですよね。

一つの型クラス(って用語でいいんだっけ)って複数個所で作られることってないよね…

  • thunk

遅延評価された後のものってのはどっからも参照されなくなってても「もう確実に使うことないよ」フラグを GC にセットするまでは消えないらしい。

main =
  a = すんごいメモリ消費する物体を返す関数
  b = hoge a
  if mode == "use_b"
    b を使う
  else
    a を使う

とかの場合、 use_b の場合に a は解放されるのか否か、みたいなことが気になった。

シューティングじゃないということまではわかった。

さっき数えたらなんとかセミナーは7回くらい行かせてもらってるみたいなので珍しくはないんじゃないのかなぁとか。

学部3年で Haskellコンパイラ読むとか尋常じゃないなぁ。なんかこめんたりーとかいうのがあるらしいけど、そんなんで勉強するより「コード読んでなんとなくわかりました!」という若さ的な何かの方が好感が持てるよなぁと。そのこと自体に対する学習効率は良くないことが多いんだろうけど。

個人的にどういうふうに実装してるんか気になってる部分としては ghci が残ってて。

あと何のために一つの関数につき3つのシンボルができるのか、とか。

なにかあれば下記メールアドレスへ。
shinichiro.hamaji _at_ gmail.com
shinichiro.h