第4章 GHCを使う

目次

4.1. オプション概観
4.1.1. コマンド行引数
4.1.2. ソースファイル中のコマンド行オプション
4.1.3. GHCiからオプションを設定する
4.2. 静的オプション、動的オプション、モード指定オプション
4.3. 意味を持つファイル接尾辞
4.4. 実行モード
4.4.1. ghc ––makeを使う
4.4.2. 式評価モード
4.4.3. 一括処理コンパイラモード
4.4.3.1. ファイルに対するデフォルトの振る舞いを上書きする
4.5. ヘルプと多弁さに関するオプション
4.6. ファイル名と分割コンパイル
4.6.1. Haskellソースファイル
4.6.2. 出力ファイル
4.6.3. 探索パス
4.6.4. コンパイルの出力先を変える
4.6.5. 中間ファイルをそのままにする
4.6.6. 一時ファイルの場所を変更する
4.6.7. インタフェースファイルに関連するその他のオプション
4.6.8. 再コンパイル検査器
4.6.9. 相互再帰的なモジュールをコンパイルするには
4.6.10. makeを使う
4.6.11. 依存関係を生成する
4.6.12. 孤立モジュールと孤立インスタンス宣言
4.7. 警告と正気度チェックのためのオプション
4.8. パッケージ
4.8.1. パッケージを使う
4.8.2. mainパッケージ
4.8.3. パッケージを使うことのHaskell言語への影響
4.8.4. パッケージデータベース
4.8.4.1. GHC_PACKAGE_PATH環境変数
4.8.5. パッケージID、依存関係、壊れたパッケージ
4.8.6. パッケージ管理(ghc-pkgコマンド)
4.8.7. Haskellソースからパッケージをビルドする
4.8.8. InstalledPackageInfo: パッケージの仕様
4.9. 最適化(コードの改善)
4.9.1. -O*: 便利な最適化フラグの「詰め合わせ」。
4.9.2. -f*: プラットフォーム非依存のフラグ
4.10. 特定の段階に関するオプション
4.10.1. それぞれの段階で使われるプログラムを変更する
4.10.2. 特定の段階にオプションを強制する
4.10.3. Cプリプロセッサに影響するオプション
4.10.3.1. CPPと文字列間隙
4.10.4. Haskell前処理器に影響するオプション
4.10.5. コード生成に影響するオプション
4.10.6. リンクに影響するオプション
4.11. 共有ライブラリを使う
4.11.1. 共有ライブラリを使うようにプログラムをビルドする
4.11.2. Haskellパッケージの共有ライブラリ
4.11.3. CのAPIをエクスポートする共有ライブラリ
4.11.4. 実行時における共有ライブラリの発見
4.12. Concurrent Haskellを使う
4.13. SMP並列計算を使う
4.13.1. SMP並列計算に関するコンパイル時オプション
4.13.2. SMP並列性のためのRTSオプション
4.13.3. SMP並列計算を使うにあたってのヒント
4.14. プラットフォーム固有のフラグ
4.15. コンパイル済みプログラムを実行する
4.15.1. 大域的なRTSオプションを設定する
4.15.2. いろいろなRTSオプション
4.15.3. ガベッジコレクタを制御するためのRTSオプション
4.15.4. 並行性と並列性に関するRTSオプション
4.15.5. プロファイルに関するRTSオプション
4.15.6. 追跡情報を得る
4.15.7. ハックする者、デバッグする者、及び好奇心過剰な魂のためのRTSオプション
4.15.8. RTSの振る舞いを変更するためのフック
4.15.9. RTSに関する情報を取得する
4.16. 外部コアファイルを生成・コンパイルする
4.17. コンパイラをデバッグする
4.17.1. コンパイラの中間構造を出力する
4.17.2. 整合性の検査
4.17.3. コア構文(-ddump系フラグ由来の)の読み方
4.17.4. 非レジスタ化コンパイル
4.18. フラグ早見表
4.18.1. ヘルプと多弁さに関するオプション
4.18.2. どの段階を実行するか
4.18.3. 通常以外の実行モード
4.18.4. 出力先の変更
4.18.5. 中間ファイルの保持
4.18.6. 一時ファイル
4.18.7. インポートされたものを見つける
4.18.8. インタフェースファイルに関するオプション
4.18.9. 再コンパイル検査
4.18.10. 対話モードのオプション
4.18.11. パッケージ
4.18.12. 言語オプション
4.18.13. 警告
4.18.14. 最適化水準
4.18.15. 個々の最適化
4.18.16. プロファイルに関するオプション
4.18.17. プログラム網羅オプション
4.18.18. Haskell前処理器オプション
4.18.19. Cプリプロセッサオプション
4.18.20. コード生成オプション
4.18.21. プログラムのリンク
4.18.22. 段階の置き換え
4.18.23. 特定の段階にオプションを強制する
4.18.24. プラットフォーム固有のオプション
4.18.25. 外部コアファイルに関するオプション
4.18.26. コンパイラのデバッグに関するオプション
4.18.27. その他のコンパイルオプション

4.1. オプション概観

GHCの振る舞いはオプションで制御される。歴史的な理由から、これはコマンド行フラグとか引数とも呼ばれる。オプションを指定する方法は次の三つである。

4.1.1. コマンド行引数

GHCを起動するときは次のような形をとる。

ghc [argument...]

コマンド行引数はオプションかファイル名のどちらかである。

コマンド行オプションは-ではじまる。これをひとまとめにすることはできない。つまり、-vO-v -Oとは異なる。オプションがファイル名より先に置かれる必要はない。例えば、ghc *.o -o fooのようにである。まず全てのオプションが処理され、全てのファイルに適用される。そのため、例えばghc -c -O1 Foo.hs -O2 Bar.hsとしてFoo.hsBar.hsに異なる最適化水準を適用するということはできない。

4.1.2. ソースファイル中のコマンド行オプション

ソースファイルと、それが必要とするコマンド行オプションの結合をとても強くした方が便利なことがある。例えば、あるHaskellソースファイルが意図的に名前の覆い隠しを使っているなら、それは-fno-warn-name-shadowingオプション付きでコンパイルされるべきである。Makefileでファイルごとのオプションの一覧を管理する代わりに、OPTIONS_GHCプラグマを使ってソースファイルに直接これを書き込むこともできる。

{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
module X where
...

OPTIONS_GHCファイルヘッダプラグマである(7.13. プラグマを見よ)。

OPTIONS_GHCの中で使えるのは動的なフラグだけである(4.2. 静的オプション、動的オプション、モード指定オプションを見よ)

ソースファイル中のオプションはコマンドシェルには渡されず、コンパイラが内部的に管理するコマンド行引数の配列に加えられるだけだということに注意せよ。そのため、OPTIONS_GHCの中でワイルドカードなどを使おうとすると猛烈にがっかりすることになるだろう。

注意: OPTIONS_GHCの内容はコマンド行オプションの後に連結されるので、ソースファイルで与えられたオプションはコマンド行から与えられたものよりも優先される。

Makefileの内容を全てソースファイルに移すのは推奨されないが、場合によってはOPTIONS_GHCプラグマを使うのが「正しい方法」である。(-keep-hc-fileを使っていて、モジュールにOPTIONフラグがあるなら、生成された.hcファイルにOPTIONS_GHCが置かれる)

4.1.3. GHCiからオプションを設定する

GHCiの中から:setコマンドを使ってオプションを変更することもできる。詳しくは2.8. :setコマンドを見よ。