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}^{↑}\)
- System F に GADTs や型族(TypeFamilies)を扱うための拡張を加えたのが System FC で、DataKinds や PolyKinds などを扱うためにさらに拡張を加えたのが System \(F_{C}^{↑}\)。
System FC と System Fω の違い
“Our system allows types of higher kind; hence the type application form τ1 τ2. However, like Haskell but unlike Fω, our system has no type-level lambda, and type equality is syntactic identity (modulo alpha-conversion).” System F with Type Equality Coercions - 3.1 Conventional features
- System FC: equality constraints and coercions
事前アンケート
本勉強会に期待すること
- 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ネタありますか?
- 第0回じゃない気がしますが,HaskellImplementorsWorkshop/2011/Takano - HaskellWiki や 情報処理学会 第86回プログラミング研究会 (2010年11月) - プログラム で発表したGHCの改造のことなら話せると思います.主にCore〜C–とRTS周辺です.みなさん興味ないかもしれませんが @tyasunao
- House のGHC patchについて説明できるかも。。 @master_q
- AboutVideos – GHC これ全員で見る? @shelarcy
議事録
GHCのソースコード全体について @master_q
GHCの改造について @tyasunao
GHCのソースコード読み環境について
@master_q は hasktags を使ってタグジャンプしてたらしい。 GHCのソースコードに添付されているutils/ghctagsを使うともっとましなTAGSができるかもしれない。 タグジャンプでもよくわからない場合には ghc-7.4.1: The GHC API で調べれば型の情報などは横断で調べられる。
GHC内部情報についてのドキュメントは Commentary – GHC から辿ると良い。
gitブランチを使ってGHCをビルドする手順は Building/GettingTheSources – GHC に記載あり。
その他GHCの変更に関する記事は Blog – GHC に投稿されることがある。
togetter
録画と写真
ネタ案出し
各自調べたいところを調査して、2ヶ月後を目処に次回開催できるといいな!