第4章 GHCを使う

目次

4.1. 始めてみよう: プログラムをコンパイルする
4.2. オプション概観
4.2.1. コマンド行引数
4.2.2. ソースファイル中のコマンド行オプション
4.2.3. GHCiからオプションを設定する
4.3. 静的オプション、動的オプション、モード指定オプション
4.4. 意味を持つファイル接尾辞
4.5. 実行モード
4.5.1. ghc --makeを使う
4.5.2. 式評価モード
4.5.3. 一括処理コンパイラモード
4.5.3.1. ファイルに対するデフォルトの振る舞いを上書きする
4.6. 多弁さに関するオプション
4.7. ファイル名と分割コンパイル
4.7.1. Haskellソースファイル
4.7.2. 出力ファイル
4.7.3. 探索パス
4.7.4. コンパイルの出力先を変える
4.7.5. 中間ファイルをそのままにする
4.7.6. 一時ファイルの場所を変更する
4.7.7. インタフェースファイルに関連するその他のオプション
4.7.8. 再コンパイル検査器
4.7.9. 相互再帰的なモジュールをコンパイルするには
4.7.10. makeを使う
4.7.11. 依存関係を生成する
4.7.12. 孤立モジュールと孤立インスタンス宣言
4.8. 警告と正気度チェックのためのオプション
4.9. パッケージ
4.9.1. パッケージを使う
4.9.2. mainパッケージ
4.9.3. パッケージを使うことのHaskell言語への影響
4.9.4. パッケージデータベース
4.9.4.1. GHC_PACKAGE_PATH環境変数
4.9.5. パッケージID、依存関係、壊れたパッケージ
4.9.6. パッケージ管理(ghc-pkgコマンド)
4.9.7. Haskellソースからパッケージをビルドする
4.9.8. InstalledPackageInfo: パッケージの仕様
4.10. 最適化(コードの改善)
4.10.1. -O*: 便利な最適化フラグの「詰め合わせ」。
4.10.2. -f*: プラットフォーム非依存のフラグ
4.11. GHCのバックエンド
4.11.1. ネイティブコード生成器(-fasm)
4.11.2. LLVMコード生成器(-fllvm)
4.11.3. Cコード生成器(-fvia-C)
4.11.4. 非レジスタ化コンパイル
4.12. 特定の段階に関するオプション
4.12.1. それぞれの段階で使われるプログラムを変更する
4.12.2. 特定の段階にオプションを強制する
4.12.3. Cプリプロセッサに影響するオプション
4.12.3.1. CPPと文字列間隙
4.12.4. Haskell前処理器に影響するオプション
4.12.5. コード生成に影響するオプション
4.12.6. リンクに影響するオプション
4.13. 共有ライブラリを使う
4.13.1. 共有ライブラリを使うようにプログラムをビルドする
4.13.2. Haskellパッケージの共有ライブラリ
4.13.3. CのAPIをエクスポートする共有ライブラリ
4.13.4. 実行時における共有ライブラリの発見
4.13.4.1. Unix
4.13.4.2. Mac OS X
4.14. Concurrent Haskellを使う
4.15. SMP並列計算を使う
4.15.1. SMP並列計算に関するコンパイル時オプション
4.15.2. SMP並列性のためのRTSオプション
4.15.3. SMP並列計算を使うにあたってのヒント
4.16. プラットフォーム固有のフラグ
4.17. コンパイル済みプログラムを実行する
4.17.1. RTSオプションを設定する
4.17.1.1. コマンド行でRTSオプションを設定する
4.17.1.2. コンパイル時にRTSオプションを設定する
4.17.1.3. RTSOPTSでRTSオプションを設定する
4.17.1.4. RTSの振る舞いを変更するためのフック
4.17.2. いろいろなRTSオプション
4.17.3. ガベッジコレクタを制御するためのRTSオプション
4.17.4. 並行性と並列性に関するRTSオプション
4.17.5. プロファイルに関するRTSオプション
4.17.6. 追跡情報を得る
4.17.7. ハックする者、デバッグする者、及び好奇心過剰な魂のためのRTSオプション
4.17.8. RTSに関する情報を取得する
4.18. 外部コアファイルを生成・コンパイルする
4.19. コンパイラをデバッグする
4.19.1. コンパイラの中間構造を出力する
4.19.2. 出力の整形
4.19.3. 不要な情報を抑制する
4.19.4. 整合性の検査
4.19.5. コア構文(-ddump系フラグ由来の)の読み方
4.20. フラグ早見表
4.20.1. 多弁さに関するオプション
4.20.2. 通常以外の実行モード
4.20.3. どの段階を実行するか
4.20.4. 出力先の変更
4.20.5. 中間ファイルの保持
4.20.6. 一時ファイル
4.20.7. インポートされたものを見つける
4.20.8. インタフェースファイルに関するオプション
4.20.9. 再コンパイル検査
4.20.10. 対話モードのオプション
4.20.11. パッケージ
4.20.12. 言語オプション
4.20.13. 警告
4.20.14. 最適化水準
4.20.15. 個々の最適化
4.20.16. プロファイルに関するオプション
4.20.17. プログラム網羅オプション
4.20.18. Haskell前処理器オプション
4.20.19. Cプリプロセッサオプション
4.20.20. コード生成オプション
4.20.21. プログラムのリンク
4.20.22. プラグインオプション
4.20.23. 段階の置き換え
4.20.24. 特定の段階にオプションを強制する
4.20.25. プラットフォーム固有のオプション
4.20.26. 外部コアファイルに関するオプション
4.20.27. コンパイラのデバッグに関するオプション
4.20.28. その他のコンパイルオプション

4.1. 始めてみよう: プログラムをコンパイルする

この章には、GHCのコマンド行構文の完全なリファレンスが、400以上のフラグも含めて書かれている。これは大きくて複雑なシステムであり、大量の詳細があるので、どこから始めれば良いのかかなり分かりにくいかもしれない。これを踏まえて、ここに入門的な節がある。以降の節で完全な構文に飛び込む前に、この節はHaskellプログラムをコンパイルするためのGHCの基本的な使い方について簡単な導入を提供する。

Hallo Worldプログラムを作ってコンパイルし、実行してみよう。まず、以下のHaskellコードを含むhello.hsというファイルを作る。

main = putStrLn "Hello, World!"

このプログラムをコンパイルするには、次のようにGHCを使う。

$ ghc hello.hs

(ここで$はプロンプトを表す。これを入力しないように)。GHCはhello.hsというソースファイルをコンパイルし、hello.oというオブジェクトファイルhello.hiというインタフェースファイルを生成する。次にこのオブジェクトファイルをGHC付属のライブラリとリンクし、Unix/Linux/Macならhello、Windowsならhello.exeという実行ファイルを作成する。

デフォルトでは、GHCは自身の動作に関して寡黙であり、表示するのはエラーメッセージだけである。裏で何が行われているかを見たいなら、コマンド行に-vを追加すれば良い。

その後、次のようにしてプログラムを実行できる。

$ ./hello
Hello World!

プログラムが複数のモジュールに分かれている場合、GHCにはMainモジュールが置かれているソースファイル名を教えてやれば十分である。そうすると、GHCはimport宣言を分析して、プログラムを構成する他のモジュールを見付け、そのソースファイルを見付ける。これは、Mainを除いて、全てのソースファイルは、その中身のモジュール名に従って名付けられなけばいけない(ドットはディレクトリ区切りに変換して)ということである。例えば、Data.Personというモジュールは、Unix/Linux/MacではData/Person.hsというファイルに、WindowsではData\Person.hsに、それぞれ置かれることになる。