栄光のグラスゴーHaskellコンパイルシステム利用の手引き バージョン7.4.1

The GHC Team


目次

The Glasgow Haskell Compiler License
1. 参考訳
1. GHCの紹介
1.1. GHCを入手する
1.2. メタ情報: ウェブサイト、メーリングリストなど
1.3. GHCのバグを報告する
1.4. GHCのバージョン番号付け規則
1.5. Release notes for version 7.2.1
1.5.1. Highlights
1.5.2. Language changes
1.5.3. Warnings
1.5.4. Dumps
1.5.5. Runtime system
1.5.6. Compiler
1.5.7. GHCi
1.5.8. ghc-pkg
1.5.9. hsc2hs
1.5.10. GHC API
1.5.11. Build System and Infrastructure
1.5.12. Libraries
1.5.12.1. array
1.5.12.2. base
1.5.12.3. bin-package-db
1.5.12.4. binary
1.5.12.5. bytestring
1.5.12.6. Cabal
1.5.12.7. containers
1.5.12.8. directory
1.5.12.9. extensible-exceptions
1.5.12.10. filepath
1.5.12.11. ghc-binary
1.5.12.12. ghc-prim
1.5.12.13. haskell98
1.5.12.14. haskell2010
1.5.12.15. hoopl
1.5.12.16. hpc
1.5.12.17. integer-gmp
1.5.12.18. old-locale
1.5.12.19. old-time
1.5.12.20. pretty
1.5.12.21. process
1.5.12.22. random
1.5.12.23. template-haskell
1.5.12.24. time
1.5.12.25. unix
1.5.12.26. Win32
1.6. Release notes for version 7.2.2
1.7. Release notes for version 7.4.1
1.7.1. Highlights
1.7.2. Full details
1.7.2.1. Language
1.7.2.2. Compiler
1.7.2.3. GHCi
1.7.2.4. Template Haskell
1.7.2.5. Profiling
1.7.2.6. Event logging
1.7.2.7. Runtime system
1.7.2.8. Build system
1.7.3. Libraries
1.7.3.1. array
1.7.3.2. base
1.7.3.3. bin-package-db
1.7.3.4. binary
1.7.3.5. bytestring
1.7.3.6. Cabal
1.7.3.7. containers
1.7.3.8. deepseq
1.7.3.9. directory
1.7.3.10. extensible-exceptions
1.7.3.11. filepath
1.7.3.12. ghc-prim
1.7.3.13. haskell98
1.7.3.14. haskell2010
1.7.3.15. hoopl
1.7.3.16. hpc
1.7.3.17. integer-gmp
1.7.3.18. old-locale
1.7.3.19. old-time
1.7.3.20. pretty
1.7.3.21. process
1.7.3.22. template-haskell
1.7.3.23. time
1.7.3.24. unix
1.7.3.25. Win32
2. GHCiを使う
2.1. GHCiの紹介
2.2. ソースファイルをロードする
2.2.1. モジュールとファイル名
2.2.2. ソースコードの変更と再コンパイル
2.3. コンパイル済みコードをロードする
2.4. プロンプトで対話的に評価する
2.4.1. I/O動作とプロンプト
2.4.2. プロンプトでdo記法を使う
2.4.3. 複数行入力
2.4.4. 型、クラスおよびその他の宣言
2.4.5. プロンプトで実際にスコープにあるのは何か
2.4.5.1. :module:load
2.4.5.2. 修飾名
2.4.5.3. :mainコマンドと:runコマンド
2.4.6. itという変数
2.4.7. GHCiにおける型のデフォルト化
2.5. GHCiデバッガ
2.5.1. ブレークポイントと変数内容の表示
2.5.1.1. ブレークポイントを設定する
2.5.1.2. ブレークポイントを一覧・削除する
2.5.2. ステップ実行
2.5.3. ブレークポイントのネスト
2.5.4. _resultという変数
2.5.5. 追跡と履歴
2.5.6. 例外をデバッグする
2.5.7. 例: 関数を調べる
2.5.8. 制約
2.6. GHCiを起動する
2.6.1. パッケージ
2.6.2. 追加のライブラリ
2.7. GHCiのコマンド群
2.8. :setコマンド
2.8.1. GHCiオプション
2.8.2. GHCiからGHCのコマンド行オプションを設定する
2.9. .ghciファイル
2.10. GHCi内でオブジェクトコードにコンパイルする
2.11. FAQと注意事項
3. runghcを使う
3.1. フラグ
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. その他のコンパイルオプション
5. プロファイルを取る
5.1. コスト集約点とコスト集約点スタック
5.1.1. コスト集約点を手動で挿入する
5.1.2. コストの配分規則
5.2. プロファイルについてのコンパイルオプション
5.3. 時間及び確保量のプロファイルを取る
5.4. メモリ使用状況のプロファイルを取る
5.4.1. ヒーププロファイルのためのRTSオプション
5.4.2. 維持原因プロファイル
5.4.2.1. 維持原因プロファイルに関するヒント
5.4.3. 経歴プロファイル
5.4.4. 実際のメモリ使用量
5.5. hp2ps––ヒーププロファイルをPostScriptへ
5.5.1. hpファイルを操作する
5.5.2. プロファイルの特定の部分に注目する
5.5.3. 実行中のプログラムのヒーププロファイルを見る
5.5.4. ヒーププロファイルを実時間で閲覧する
5.6. 並列・並行プログラムのプロファイルを取る
5.7. コード網羅率を観察する
5.7.1. 小さな例: 逆数をとる
5.7.2. 網羅率の測定器を付与するオプション
5.7.3. hpcツールキット
5.7.3.1. hpc report
5.7.3.2. hpc markup
5.7.3.3. hpc sum
5.7.3.4. hpc combine
5.7.3.5. hpc map
5.7.3.6. hpc overlayとhpc draft
5.7.4. Haskell Program Coverageの注意点と短所
5.8. 「ticky-ticky」プロファイルを使う
6. より早く、より高速で、より小さく、より慎ましくあるための助言
6.1. より早く: プログラムを素早く生成する
6.2. より速く: 高速に動作するプログラムを作る
6.3. より小さく: 小さいプログラムを作る
6.4. より慎ましく: 少ないヒープで動作するプログラムを作る
7. GHCの言語機能
7.1. 言語オプション
7.2. 非ボックス化型とプリミティブ演算
7.2.1. 非ボックス化型
7.2.2. 非ボックス化タプル
7.3. 構文的拡張
7.3.1. Unicode構文
7.3.2. 魔法の井桁(magic hash)
7.3.3. 階層的モジュール
7.3.4. パターンガード
7.3.5. ビューパターン
7.3.6. n+kパターン
7.3.7. 伝統的なレコード構文
7.3.8. 再帰的do記法
7.3.8.1. 再帰的do記法についての詳細
7.3.8.2. mdo記法 (廃止予定)
7.3.9. 並行リスト内包表記
7.3.10. 一般化(SQL風)リスト内包表記
7.3.11. Monad内包表記
7.3.12. 再束縛可能な構文とPreludeの暗黙インポート
7.3.13. 後置演算子
7.3.14. タプルのセクション
7.3.15. レコードフィールドの曖昧性除去
7.3.16. レコード同名利用
7.3.17. レコードワイルドカード
7.3.18. 局所結合性宣言
7.3.19. パッケージ修飾されたインポート
7.3.20. safeインポート
7.3.21. 盗まれた構文の概略
7.4. データ型と型シノニムへの拡張
7.4.1. 構築子のないデータ型
7.4.2. データ型文脈
7.4.3. 中置型構築子、中置クラス、中置型変数
7.4.4. 型シノニムの制限緩和
7.4.5. 存在量化されたデータ構築子
7.4.5.1. どこが存在的か?
7.4.5.2. 存在型と型クラス
7.4.5.3. レコード構築子
7.4.5.4. 制約
7.4.6. 構築子のシグネチャを明示してデータ型を宣言する
7.4.7. 一般化代数データ型(GADT)
7.5. 「deriving」機構への拡張
7.5.1. deriving節について推論される文脈
7.5.2. 独立deriving宣言
7.5.3. より広範なクラスについてのderiving節(TypeableDataなど)
7.5.4. newtypeについての自動導出インスタンスの一般化
7.5.4.1. deriving節の一般化
7.5.4.2. より精密な規定
7.6. クラスおよびインスタンス宣言
7.6.1. クラス宣言
7.6.1.1. 多引数の型クラス
7.6.1.2. クラス宣言のスーパークラス
7.6.1.3. クラスメソッドの型
7.6.1.4. デフォルトメソッドシグネチャ
7.6.2. 関数従属
7.6.2.1. 関数従属に関する諸規則
7.6.2.2. 関数従属の背景
7.6.3. インスタンス宣言
7.6.3.1. インスタンス頭部に関する規則の緩和
7.6.3.2. インスタンス文脈に関する規則の緩和
7.6.3.3. 決定不能インスタンス
7.6.3.4. 重複インスタンス
7.6.4. 文字列リテラルの多重定義
7.7. 型の族
7.7.1. データ族
7.7.1.1. データ族宣言
7.7.1.2. データインスタンス宣言
7.7.1.3. データインスタンスの重複
7.7.2. シノニム族
7.7.2.1. 型族宣言
7.7.2.2. 型インスタンス宣言
7.7.2.3. 型シノニムインスタンスの重複
7.7.2.4. 型シノニムインスタンスの決定可能性
7.7.3. 関連データ族と関連型族
7.7.3.1. 関連インスタンス
7.7.3.2. 関連型シノニムのデフォルト
7.7.3.3. クラスパラメタのスコープ規則
7.7.4. インポートとエクスポート
7.7.4.1. 例
7.7.4.2. インスタンス
7.7.5. 型族とインスタンス宣言
7.8. 種多相と昇格
7.8.1. 種多相
7.8.2. データ型の昇格
7.8.2.1. 型と構築子の区別
7.8.2.2. 昇格したリスト型とタプル型
7.8.3. 現在の実装の欠点
7.9. 同値性制約
7.10. Constraintという種
7.11. 型システムへのその他の拡張
7.11.1. 明示的な全称量化(forall)
7.11.2. 型シグネチャの文脈
7.11.3. 暗黙パラメタ
7.11.3.1. 暗黙パラメタ型制約
7.11.3.2. 暗黙パラメタの束縛
7.11.3.3. 暗黙パラメタと多相再帰
7.11.3.4. 暗黙パラメタと単相性
7.11.4. 明示的に種付けされた量化
7.11.5. 任意ランク多相
7.11.5.1. 例
7.11.5.2. 型推論
7.11.5.3. 暗黙の量化
7.11.6. 非叙述的多相
7.11.7. 字句的スコープを持つ型変数
7.11.7.1. 概観
7.11.7.2. 宣言型シグネチャ
7.11.7.3. 式型シグネチャ
7.11.7.4. パターン型シグネチャ
7.11.7.5. クラス宣言とインスタンス宣言
7.11.8. 相互再帰的な束縛に対する型付けの一般化
7.11.9. 単相的な局所束縛
7.12. Template Haskell
7.12.1. 構文
7.12.2. Template Haskellを使う
7.12.3. Template Haskellの実例
7.12.4. Template Haskellをプロファイルと併用する
7.12.5. Template Haskellの準クォート
7.13. アロー記法
7.13.1. コマンドのdo記法
7.13.2. 条件コマンド
7.13.3. 制御構造を自分で定義する
7.13.4. プリミティブな構成要素
7.13.5. 論文との差異
7.13.6. 可搬性
7.14. びっくりパターン
7.14.1. びっくりパターンについての非形式的な説明
7.14.2. 構文と意味論
7.15. アサーション
7.16. プラグマ
7.16.1. LANGUAGEプラグマ
7.16.2. OPTIONS_GHCプラグマ
7.16.3. INCLUDEプラグマ
7.16.4. WARNINGおよびDEPRECATEDプラグマ
7.16.5. INLINEおよびNOINLINEプラグマ
7.16.5.1. INLINEプラグマ
7.16.5.2. INLINABLEプラグマ
7.16.5.3. NOINLINEプラグマ
7.16.5.4. CONLIKE修飾子
7.16.5.5. 段階管理
7.16.6. LINEプラグマ
7.16.7. RULESプラグマ
7.16.8. SPECIALIZEプラグマ
7.16.8.1. SPECIALIZE INLINE
7.16.8.2. インポートした関数のSPECIALIZE
7.16.8.3. 旧式のSPECIALIZE構文
7.16.9. SPECIALIZE instanceプラグマ
7.16.10. UNPACKプラグマ
7.16.11. NOUNPACKプラグマ
7.16.12. SOURCEプラグマ
7.17. 書き換え規則
7.17.1. 構文
7.17.2. 意味論
7.17.3. 書き換え規則と、INLINE/NOINLINEおよびCONLIKEプラグマとの間の相互作用
7.17.4. リストの融合変換
7.17.5. 特殊化
7.17.6. 書き換え規則の中で何が起こるか制御する
7.17.7. COREプラグマ
7.18. 特殊な組込み関数
7.19. 総称クラス
7.20. 総称プログラミング
7.20.1. 表現を導出する
7.20.2. 総称関数を書く
7.20.3. 総称的デフォルト
7.20.4. さらなる情報
7.21. 単相性の制御
7.21.1. 恐怖の単相性限定を無効にする
7.21.2. 単相的パターン束縛
7.22. Concurrent HaskellおよびParallel Haskell
7.22.1. Concurrent Haskell
7.22.2. Software Transactional Memory
7.22.3. Parallel Haskell
7.22.4. 純粋なコードに並列計算用の注釈を加える
7.22.5. Data Parallel Haskell
7.23. Safe Haskell
7.23.1. Safe Haskellの用途
7.23.1.1. 厳格な型安全性(良いスタイル)
7.23.1.2. セキュアなシステムを構築する(制約付きIOモナド)
7.23.2. safe language
7.23.3. safeインポート
7.23.4. 信頼とSafe Haskellのモード
7.23.4.1. 信頼検査(-fpackage-trustが無効の場合)
7.23.4.2. 信頼検査(-fpackage-trustが有効の場合)
7.23.4.3. 例
7.23.4.4. Trustworthyの要件
7.23.4.5. パッケージへの信頼
7.23.5. Safe Haskellの推論
7.23.6. Safe Haskellのフラグまとめ
8. 他言語関数インタフェース(FFI)
8.1. FFI追補に対するGHCの拡張
8.1.1. 非ボックス化型
8.1.2. IOモナドを包むnewtype
8.1.3. プリミティブのインポート
8.1.4. 割り込み可能な他言語呼び出し
8.2. GHCでFFIを使う
8.2.1. GHCでforeign exportforeign import ccall "wrapper"を使う
8.2.1.1. 自分で用意したmain()を使う
8.2.1.2. 他言語のコードから呼べるようなHaskellライブラリを作る
8.2.2. ヘッダファイルを使う
8.2.3. メモリ確保
8.2.4. マルチスレッドとFFI
8.2.4.1. foreign importとマルチスレッド
8.2.4.2. HaskellスレッドとOSスレッドの関係
8.2.4.3. foreign exportとマルチスレッド
8.2.4.4. hs_exit()の使用について
8.2.5. 浮動小数点とFFI
9. GHCを拡張する・ライブラリとして使う(GHC as a Library)
9.1. ソース注釈
9.1.1. 値に注釈を付ける
9.1.2. 型に注釈を付ける
9.1.3. モジュールに注釈を付ける
9.2. GHCをライブラリとして使う
9.3. コンパイラプラグイン
9.3.1. コンパイラプラグインを使う
9.3.2. コンパイラプラグインを書く
9.3.2.1. CoreToDoについてより詳しく
9.3.2.2. 束縛を操作する
9.3.2.3. 注釈を使う
10. 何かがうまくいかないとき
10.1. コンパイラが「正しくないこと」をしたとき
10.2. あなたのプログラムが「正しくないこと」をしたとき
11. その他のHaskellユーティリティプログラム
11.1. “Haskell用Yacc”: happy
11.2. CコードへのHaskellインタフェースを書く: hsc2hs
11.2.1. コマンド行構文
11.2.2. 入力の構文
11.2.3. 自分で構文要素を用意する
11.2.4. クロスコンパイル
12. Win32システムでGHCを運用する
12.1. WindowsプラットフォームでGHCを起動する
12.2. WindowsでGHCiを実行する
12.3. 端末を使った対話
12.4. ライブラリの振る舞いにおける差異
12.5. GHC(および、GHCでコンパイルされた実行ファイル)をcygwinで使う
12.5.1. 背景
12.5.2. 問題
12.5.3. するべきこと
12.6. Win32のDLLをビルド・利用する
12.6.1. DLLを作成する
12.6.2. 他の言語から呼ぶためのDLLを作る
12.6.2.1. VBAから使う
12.6.2.2. C++から使う
13. 既知のバグと問題点
13.1. Haskell 標準とGlasgow Haskell、言語上の不準拠点
13.1.1. Haskell 98およびHaskell 2010からの逸脱
13.1.1.1. 字句的構文
13.1.1.2. 文脈自由文法
13.1.1.3. 式とパターン
13.1.1.4. 宣言と束縛
13.1.1.5. モジュールシステムとインタフェースファイル
13.1.1.6. 数値、基本型、組込みクラス
13.1.1.7. Preludeサポートに関すること
13.1.1.8. 多言語関数インタフェース
13.1.2. Haskell 98とHaskell 2010の未定義動作についてのGHCの解釈
13.1.3. FFI仕様からの逸脱
13.2. 既知のバグと問題点
13.2.1. GHCのバグ
13.2.2. GHCi(対話的GHC)のバグ
索引

日本語訳について