Workshop/ReadGHC/0

調整/当日スケジュール

GHCソースコードリーディング勉強会 第0回(準備編) - [PARTAKE]

資料

GHC の機能と関わりの深いライブラリやツールなどの取得

どの部分を読むかにもよりますが、GHC の機能の一部は base パッケージや
DPH ライブラリ(並列配列)、haddock など外部のライブラリやツールと関
わっているので、ちゃんと読もうとするなら、その辺も取得しておく必要が
ありますね。(またビルド時にはこれらのライブラリやツールが必要です。)

git clone 後、以下のコマンドを実行して下さい。

./sync-all get

テストやベンチマーク、その他のライブラリも必要なら、こちらのコマンド
になります。

./sync-all --testsuite --nofib --extra get

 http://hackage.haskell.org/trac/ghc/wiki/Building/GettingTheSources
 http://hackage.haskell.org/trac/ghc/wiki/Repositories

(GHC に DPH ライブラリの同梱されていない)ghc-7.4 branch などをビル
ドする場合、DPH ライブラリの取得には --dph オプションが必要です。逆に
HEAD などで DPH ライブラリが不要な場合には --no-dph が必要です。

ghc –make実行時のコールグラフ

その1

  → doMake -- ghc/Main.hs
    targets <- mapM (uncurry GHC.guessTarget) hs_srcs
    GHC.setTargets targets -- セッション情報のhsc_targetsを設定
    ok_flag <- GHC.load LoadAllTargets
    → load -- compiler/main/GhcMake.hs
      → load2
        → upsweep
          → upsweep_mod 
            → compile_it
              → compile -- compiler/main/DriverPipeline.hs
                → compile' (hscCompileNothing, hscCompileInteractive, hscCompileBatch)
                  → runCompiler batchCompiler handleBatch

その2

  → runCompiler batchCompiler handleBatch -- compiler/main/DriverPipeline.hs
    → hscCompileBatch -- compiler/main/HscMain.hs
      → genericHscCompile hscBatchCompiler batchMsg
         compile RecompRequired
         → runHsc hsc_env $ hscRecompile compiler mod_summary mb_old_hash
           → genericHscRecompile hscBatchCompiler
             → hscFileFrontEnd mod_summary
               → hscParse' mod_summary
                 -- xxx Parser --
               → tcRnModule -- compiler/typecheck/TcRnDriver.lhs
                 -- xxx Typecheck-Rename --
             hscBackend compiler tc_result mod_summary mb_old_hash
             → genericHscBackend hscBatchCompiler
               guts <- hscDesugar' (ms_location mod_summary) tc_result
               → deSugar -- compiler/deSugar/Desugar.lhs
                 -- xxx Desugar --
               hscGenOutput compiler guts mod_summary mb_old_hash
               → hscGenOutput hscBatchCompiler
                 → hscSimplify' guts0
                   -- xxx Simplify? (Core2Core) --
                 → hscNormalIface guts mb_old_iface
                   -- xxx CoreTidy --
                 hscWriteIface iface changed mod_summary
                 → hscGenHardCode cgguts mod_summary
                   -- xxx CorePrep --
                   -- xxx CoreToStg --
                   -- xxx CodeGen --
                   -- xxx CodeOutput
    linkable <- handleBatch result
    → runPipeline StopLn hsc_env' (output_fn,Nothing) (Just basename)
                                   Persistent (Just location) maybe_stub_o
       -- ghc --makeだと何もせず終わるらしい

↑の個々のxxxの部分は Compiling one module: HscMain の図に相当すると思われる。

LexerとParserが協調動作

-- Parser.hs
parseModule = happySomeParser where
  happySomeParser = happyThen (happyParse action_0)
                    (\x -> case x of {HappyAbsSyn9 z -> happyReturn z; _other -> notHappyAtAll })

happyThen :: () => P a -> (a -> P b) -> P b
happyThen = (>>=)
happyReturn :: () => a -> P a
happyReturn = (return)

happyParse start_state = happyNewToken start_state notHappyAtAll notHappyAtAll

happyNewToken action sts stk
	= lexer(\tk -> 
	let cont i = action i i tk (HappyState action) sts stk in
	case tk of {
	L _ ITeof -> action 367 367 tk (HappyState action) sts stk;
	L _ ITunderscore -> cont 233;
        --snip--
	L _ (ITquasiQuote _) -> cont 366;
	_ -> happyError' tk
	})

-- Lexer.hs
lexer :: (Located Token -> P a) -> P a
lexer cont = do
  alr <- extension alternativeLayoutRule
  let lexTokenFun = if alr then lexTokenAlr else lexToken
  (L span tok) <- lexTokenFun
  --trace ("token: " ++ show tok) $ do
  cont (L (RealSrcSpan span) tok)

コア言語

GHC 7.4.1 のコア言語は System \(F_{C}^{↑}\)

事前アンケート

本勉強会に期待すること

  • GHC の構成概要の理解、GHCで使われているテクニックが理解できること @utotch
  • GHC と関係なくてもよいですが、皆さんが Haskell 界隈で興味を持っていること(Web とか コンパイラとか Graphics とか,,,)の情報共有 @utotch
  • Haskell を仕事で活用している人の情報共有 などなどができるとうれしいな。 @utotch
  • cabalの概要、現状の仕組み、問題点 @ruicc
  • ghc –make に -j オプションを加えるghc-parmakeの機能を取り込む)ための課題の理解 @shelarcy
  • GHC由来で発生したバグを取る方法 @ruicc
  • HaskellをJVM上で動かすために障害となるもの、制約:) @ruicc
  • House など組込み向けGHC拡張パッチの理解 @master_q

GHCのどの部分に興味がありますか?

  • 高速化のための工夫 @utotch
  • LLVM との融合 @utotch
  • GHC pluginの仕組み、概要、作りかた @ruicc
  • 途中で作成される中間データ別概要 @ruicc
  • 各中間データ上で実行される最適化手法 @ruicc
  • クロスコンパイル/クロスビルド機能(の現状) @shelarcy

LTネタありますか?

議事録

GHCのソースコード全体について @master_q

プレゼン資料:GHCソースコード読みのススメ

GHCの改造について @tyasunao

プレゼン資料:GHCの改造について

GHCのソースコード読み環境について

@master_qhasktags を使ってタグジャンプしてたらしい。 GHCのソースコードに添付されているutils/ghctagsを使うともっとましなTAGSができるかもしれない。 タグジャンプでもよくわからない場合には ghc-7.4.1: The GHC API で調べれば型の情報などは横断で調べられる。

GHC内部情報についてのドキュメントは Commentary – GHC から辿ると良い。

gitブランチを使ってGHCをビルドする手順は Building/GettingTheSources – GHC に記載あり。

その他GHCの変更に関する記事は Blog – GHC に投稿されることがある。

togetter

録画と写真

録画1 録画2 録画3

写真

ネタ案出し

参加者の興味のある部分(…Parserに興味ある人がゼロ…)

参加者の興味のある部分(…Parserに興味ある人がゼロ…)

まだHEADに取り込まれていないブランチ

まだHEADに取り込まれていないブランチ

各自調べたいところを調査して、2ヶ月後を目処に次回開催できるといいな!

次回

1