読者です 読者をやめる 読者になる 読者になる

わどぅー

記事については、中間出力の場合も多いので間違ってたらごめんなさい。twitter は waddlaw です。どうぞよろしく。

GHC のソースコードを読んでいます

Haskell

その際に、タグジャンプを使うと効率良くコードリーディングできるとわかったので以下に使い方をメモしておきます。

Haskell のタグジャンプ

文献[1]によると Haskell のタグジャンプには次の3種類があります。

  • GHC: GHCi からタグファイルを生成します。現在ロードされているモジュールに関するタグファイルを生成するためには ':ctags' または ':etags' コマンドを利用します。

利用例。

 $ echo ":ctags" | ghci -v0 Main.hs
 $ echo ":etags" | ghci -v0 Main.hs
  • Hasktags: ctags コマンドまたは etags コマンドと互換性のあるタグファイルを生成します。
  • Gasbag: Hasktags を改良したバージョンらしい。
GHC

メリット: GHCi があれば利用できるのですぐ試せる。
デメリット: モジュールがロード可能なときに限り、タグファイルを生成するので、ロードできない場合には使えない。GHC のコードを読むには使いにくいかなぁ?

Hasktags

Haskell 用のタグ生成ツール.ctag, etag に対応している.生成されるタグファイルの名前はそれぞれ tags (ctag), TAGS (etag) となる.

  • インストール方法
    1. cabal update
    2. cabal install hasktags
    3. (Ubuntu だと) /.cabal/bin/ に hasktags がインストールされるのでパスを通す.
  • 使い方

文献[3]によると以下のコマンドで .hs, .lhs ファイルを対象にタグファイルを生成できるようです。

$ find -name \*.\*hs | xargs hasktags

しかし、GHC のコードには C 言語のコードを FFI によって呼び出していたりするので、.c, .h のファイルにもジャンプしたい場合は以下のようにすると良いと思います。
(別途 ctags コマンドをインストールしておく必要有)

$ ctags -R --languages=C --langmap=C:.h.c ; find -name \*.\*hs | xargs hasktags -a ; sort -o tags tags

具体例

 $ wget http://www.haskell.org/ghc/dist/7.4.1/ghc-7.4.1-src.tar.bz2
 $ tar jxvf ghc-7.4.1-src.tar.bz2
 $ cd ghc-7.4.1/
 $ ctags -R --languages=C --langmap=C:.h.c ; find -name \*.\*hs | xargs hasktags -a -c ; sort -o tags tags
 $ vi ghc/InteractiveUI.hs

この場合 ctag を生成してるので vi で適当なファイルを読みこめばタグジャンプできるはずです。vi で使うコマンドは以下の3つぐらい?

  • CTRL + t : 呼び出し元へ戻る
  • CTRL + ] : 定義へジャンプ
  • CTRL g + ] : 複数の候補がある場合に選択してジャンプ


これで満足したから Hasktags を使うことにする。