# ghcインストール前に入れる
|
|
-
/usr/local/以下にインストールしても構わない場合はcloneしてきたディレクトリ上に移動して作業する
-
install先を指定する場合は以下の処理を行ってから作業する
- ディレクトリ作成、移動
|
|
-
cabalをインストールする
$ brew install cabal-install
-
happyとAlexをインストールする
|
|
- happyとAlexにシンボリックリンクを貼る
|
|
# インストール
-
公式ホームページ(https://ghc.haskell.org/trac/ghc/wiki/Building )を参考に
-
mac osはこれを見て環境設定 https://ghc.haskell.org/trac/ghc/wiki/Building/Preparation/MacOSX
-
debugはこれを見る https://ghc.haskell.org/trac/ghc/wiki/Debugging/Compiler
-
詳しくはここ https://ghc.haskell.org/trac/ghc/wiki/Building/Using
-
Haskellコンパイラはセルフビルドする必要性がある為Stage0->Stage1->Stage2の順でビルドする
-
まずはGitリポジトリからGHCをcloneする https://ghc.haskell.org/trac/ghc/wiki/Building/GettingTheSources
|
|
- bootを叩く時にm4などが必要になる
|
|
-
残念ながらpathが通らないのでbrew install時に出たパスをzshrcにいれる
-
git で落としてくる
|
|
-
buildファイルが無いのでbuild.mk.sampleをリネームして用意する
-
/usr/local/以下にインストールしても構わない場合はcloneしてきたディレクトリ上に移動して作業する
|
|
- install先を指定する場合は以下の処理を行ってから作業する
- install先ディレクトリ作成、移動
|
|
- ソースへのリンク作成
|
|
-
bootスクリプトの実行 $ ./ boot 以前はPerlだったらしいがPythonに変わってた
-
configureの実行
$ ./configure
- install先を指定する場合は以下のようにprefixを指定する
$ ./configure --prefix=$PWD
-
configure時
configureにときにhappyが無いと言われるケースが存在する. happyはhaskellのパーサジェネレータで,Haskellのstack(The Haskell Tool Stack)かcabalで導入する.
stackの場合 ghcも入る
|
|
cabal
|
|
- build.mk の作成
- mk以下にbuild.mk.sampleというファイルがあるのでそれをコピーして編集
|
|
12行目辺りの以下の部分を#を消して有効に
|
|
80行目付近の以下の部分を
|
|
このように編集する
|
|
今はこうする?
|
|
- makeとmake installする
- top levelのmakeが下のmakeを呼ぶときに -j が引き継がれるようにする。
|
|
prefixを指定した場所に、ghcができている。指定してなければ/usr/local/bin/。
- エラーと対処法
|
|
- 異なるバージョンのghcでコンパイルされたバイナリが残っているのが原因なのでいちど.hi-boot,.hiファイルを消す。
|
|
- ghc-pkg: ghc no longer supports single-file style package databases
- ghc-pkg 7.9ではファイル形式のデータベースはサポートしていないのでinitし直す必要がある。
- 古いghcを消した時に発生した。
|
|
# 1日目
# どこのghcが呼ばれているのかを調べる
- 新しくインストールしたghcを、適当なディレクトリに移動する
|
|
- 最後の行のexecをechoに変更する
|
|
これで、ghcを実行する時、どのファイルが呼ばれるかがわかる
# lldbで追っかけようとした
|
|
これでは、mainがないというエラーが出る話が
# アセンブラを生成する
-
append.hsを編集し、先頭にModuleを追加する。
- .oを生成
|
|
- .s(アセンブラコード)を生成
|
|
# ghc_build/compiler/main/HscMain.hsをghciで動かす
- ghcがあるディレクトリへ移動
|
|
-
Hscmain.hsを、ghciで動かすために様々なオプションを追加する
- cpp : Cのプリプロセッサを通す
- I : #includeファイルを探すディレクトリを、通常のCでの方法で指定する
- S : .s(アセンブラコード)を生成
- i : 必要なモジュールのディレクトリを指定する
- D : 値を定義する
-
オプションを探す場合 $ ghc –help $ man ghc
##Main.hsを動かす
-
FingerPrint.hsが重複していて、エラーが出た
- FingerPrint.hsを読み込まないように、
__GLASGOW_HASKELL__
< 707なif文にかかる処理を取った- これをとるとmakeが通らなくなったので必要な処理だったようだ
- buildされるghcのバージョンではなくbuildに使用したghcのバージョン?
|
|
-
この方法でghciは通った
-
次は、ghc_build/compiler/main/HscMain.hsを動かしたい
-
HscEnv とCompileFileを呼び出せばいい
-
InitSysToolsをつかってSettingsを作る
|
|
- SettingsからDynFlagsが作れる (defaultDynFlags.Settings DynFlag.hs) let df = DynFlags.defaultDynFlags s
- DynFlagsからHscEnvが作れる (newHscEnv HscMain.hs)
HscMain.newHscEnv df
- ライブラリが見つからないと怒られる
# 2日目
# Haskell Compilerについて勉強する
スライド(http://www.scs.stanford.edu/11au-cs240h/notes/ghc-slides.html#%281%29)を 読んで、Haskell Compilerについて勉強する。
# GCについて勉強
スライド(http://www.slideshare.net/dec9ue/rts-gc)を読んで、 Gerbage Collectionについて勉強する。
# Main.hsを動かす(2)
-
.hiと.oがあると、ghciのbreak pointがかけられない。 $ -fno-code を適用すると .o が作成されなくなる
-
動かない。Makeをやりなおし。
# デバッグオプションがついてない?(問題編)
-
config.mk.inの作成 GhcDebugged=YES
-
configureを実行すると、GhcDebuggedがNOになる。 GhcDebugged=NO
# 3日目
# デバッグオプションがついてない?(解決編)
- 設定を書き換えたい分だけは、新しいファイル(build.mk)に書き込む。
- build.mkの作成
GhcDebugged=YES
# lldbで読もう
-
lldbでcプログラムを読むように、ghcの実行ファイルを読む。
-
nmコマンドを使って、symboltableから、調査対象の関数名とプログラムアドレスを抜き出す。
-
プログラムアドレスにbreak pointをあてて、そこからstep実行をして、動作を細かく調査しようとした。
-
lldbで読んだ結果
- ライブラリの読み込みやインダイレクトジャンプばかりをやっていて、追いにくそう..
# parser/Lexer.x を読む。
定義を確認し、alexにかけることで**.hsに変換 alex Parser.x 変換したParser.hsを読む。
# Lexer.hsをghciにいれてみる。
|
|
- Libraryが読み込めないからソースコードから読むことに。
- Lexer.hsには字句解析について書かれている。
- AlexInputが怪しいのでは?
- AlexInputが書かれているコードを探す -> Parser.yに書かれているらしい
# parser/Parser.hsを読む
Parser.y を happyで *.hsに変換 happy Parser.y
-
Parser.hsで予約語の確認など(tokenとかも)
-
数字の定義をするのが大変らしい
-
happyThenとは? -> ammsの定義を確認
- aaって何? -> aa = annotation
- amms = リストに対してannotationをマップして付けるもの
# ParseResultとは?
- parser/Lexer.hsにあるらしい
- runParser発見!
# parser を実行したい
- parser/Parser.y
- happy parser/Parser.y
- で parser/Parser.hs が手に入る
- parser は runParser で実行できそう? ソースにコメントで書かれてた
|
|
# PState とは?
- parser/HscMain.hsにcaseで使われてる。
# Desugar を追う。
Hskellからcoreにするときにdesugarするので、Desugarを追う。
-
desugar/Desugar.hsに書かれてる。
# dsLExprとは
- deSugar/DsExpr.hsに書いてある。
- coreExpr を発見
- coreの計算を行うところらしい。
- oreSyn/CoreSyn.hsに書いてある。
- coreの計算を行うところらしい。
- coreSyn/CoreSyn.hsでcoreの定義がされている。
# 他に読むものは?
- typechaek/TcUnify.hsを見たら推論木がわかりそう。
- typecheck/TcType.hsを流し読み。
# 2018
# Haskell入門
-
ソフトウェア工学でも行ったbinary treeの例題
-
Tree.hsを作る
|
|
-
ghci Node.hs
-
ghcでcoreの出力を見る!!
-
mainが無いとghcでコンパイルできない
|
|