2. GHC の紹介

これはGlasgow Haskell Compiler (GHC)の使い方ガイドです. GHCはプログラミング言語 Haskell 2010 用の対話式インタプリタ・一括処理式コンパイラです.

GHCには主に2つの構成要素があります. 1つは,GHCiとも呼ぶ対話方式のHaskellインタプリタで,これについては GHCiを使う で説明します. もう1つは,一括処理方式のコンパイラで,これについては Using GHC で説明します. GHCは実際のところは単一のプログラムで,起動時のオプション指定によって,対話方式のインタプリタになったり,一括処理方式のコンパイラになったりします.

一括処理のコンパイラはGHCiと並行して使えます. 対話的セッション中にコンパイル済みモジュールをロードすることができ,ロードされたものは解釈実行コードと同じように扱えます. 実際,GHCiを使うとき,ライブラリコードの大部分はコンパイル済みのものが使われています. つまり,二つの方法の良いとこどりができるということです. どういうことかというと,あらかじめコンパイルしておいた高速で実行できるライブラリコードが手にはいり,活発に開発されている部分を繰り返しコンパイルするのにかかる時間を短くできるということです.

GHCはたくさんの言語拡張をサポートしています. たとえば,並行性,外部関数インタフェース,例外,それにさまざまな型システムの拡張などです. 型システムの拡張には,多引数の型クラス,局所的な全称/存在量化,関数従属,スコープを持つ型変数,明示的な非ボックス化型などの拡張があります. これらの言語拡張については全て GHC Language Features で説明します.

GHCには広範囲にわたって最適化を行う機構があり,そのつもりになれば(そして,時間に余裕があるなら)GHCでそうとう速いコードを生成できます. それとは反対に,デフォルトのオプションは生成するコードを過度に最適化しようとはせずに,なるべく速くコンパイルできるように調整されています. (そうはいっても,GHCは,たぶん,いわゆる速いコンパイラではありません.笑)

GHCのプロファイリングシステムは「コスト集約点スタック」をサポートしています. コスト集約点スタックとはHaskellプログラムのプロフィールをコールグラフ状の構造として見るためのものです. 詳しくは Profiling を参照してください.

GHCには多数のライブラリが付属しています. これらのライブラリについて別の文書で説明されています.

2.1. GHCの入手方法

GHC home page に行って「download」のリンクを辿って自分のプラットフォーム用のGHCをダウンロードしてください.

そうする以外に,自分でGHCをビルドしたい場合には, GHC Building Guide に行けば,ソースを入手する方法,手元でビルドする方法が判ります. GHCそれ自身はHaskellで書かれていることに注意してください. ビルドするためには,そのためのGHCをインストールしなければならないということです.

2.2. メタ情報: Webサイト,メーリングリストなど

関連サイトとしては以下があります.

GHCに関しては以下のようなメーリングリストを運営しています. 参加したいと思ったところに参加することをおすすめします.

glasgow-haskell-users

ここはGHCの利用者が互いにおしゃべりをする場です. なにかGHCに関して具体的な質問があれば、先ず FAQ を見てください.

参加者の投稿先は glasgow-haskell-users@haskell.org です. 詳しくは Mailman page を見てください.

ghc-devs

GHC開発者はここに出入りしています. GHC APIを使っていたり,GHCの実装に関して質問があれば,遠慮なく話に割って入ってください.

参加者の投稿先は ghc-devs@haskell.org です. 詳しくは Mailman page を見てください.

www.haskell.org では,他にもHaskellやGHCに関連するメーリングリストが提供されています. http://www.haskell.org/mailman/listinfo/ に一覧があります.

2.3. GHCのバグの報告方法

Glasgow Haskellは変化を続けるシステムであり,そこには必ずバグがあります. バグを見つけたら, このwikiページ を見て,バグを報告する方法を知ってください.

2.4. GHCのバージョン番号付けの方針

GHCバージョン6.8以降,GHCのバージョン番号の振り方は以下の方針にしたがっています.

安定版ブランチには x.y と振ります. ただし y偶数 です. 安定版ブランチ x.y でのリリースには x.y.z と振ります. ただし, z (1以上)はパッチレベル番号です. パッチレベルのリリースはバグ修正のみで,システムが提供するコードへの プログラマ用インターフェイスを変更することはありません. しかし,新しいパッチレベルリリースを古いリリースに上書きインストールした場合, 古いライブラリに対してコンパイルされたコードは全てコンパイルし直さなければなりません.

メジャーリリース x.y.z では __GLASGOW_HASKELL__ (Options affecting the C pre-processor 参照) の値は xy (ただし, y が一桁のときは前に 0 を置きます.たとえば,GHCバージョン6.8.2 では, __GLASGOW_HASKELL__==608) となります.

現在の安定版ブランチのスナップショットリリースを作成して, ここからダウンロード可能 にすることもあります. また、最新のソースは gitリポジトリ からダウンロード可能です.

安定版スナップショットリリースは x.y.z.YYYYMMDD という名前になります. ここで, YYYYMMDD はスナップショットのビルド元になったソースの日付けです. x.y.z+1 が,そのブランチでの次のリリースになります. たとえば 6.8.1.200402256.8 ブランチのスナップショットで, 6.8.2 の開発中に作るものです.

スナップショットリリースでは __GLASGOW_HASKELL__ の値は(安定版のときと同様) xy となります. しかし,この値をチェックする条件コードを書いてはいけません. インターフェイスは日毎に変わるにもかかわらず __GLASGOW_HASKELL__ では, これ以上細かい精度の値を表せませんから __GLASGOW_HASKELL__ の値をチェックするなら メジャーリリース番号との間でだけ大小・等値比較を行ってください.

HEAD のスナップショットリリースは ダウンロード できるようにし,最新のソースは the git repositories で利用できるようにします.

不安定版スナップショットリリースは x.y.YYYYMMDD という名前になります. ここで, YYYYMMDD はスナップショットのビルド元になったソースの日付けです. たとえば 6.7.20040225HEAD のスナップショットで 6.8 ブランチ を作成する前の段階で作成します.

スナップショットリリースでは __GLASGOW_HASKELL__ の値は(安定版のときと同様) xy となります. しかし,この値をチェックする条件コードを書いてはいけません. インターフェイスは日毎に変わるにもかかわらず __GLASGOW_HASKELL__ では, これ以上細かい精度の値を表せませんから __GLASGOW_HASKELL__ の値をチェックするなら メジャーリリース番号との間でだけ大小・等値比較を行ってください.

手元のGHCのバージョン番号は ghc--version フラグ付きで起動すれば判ります (Verbosity options 参照).

コンパイラのバージョンはコンパイルするコードの中でチェックできます. これは CPP のマクロ MIN_VERSION_GLASGOW_HASKELL を使います (このマクロは -XCPP が指定されたときのみ有効です). 詳しくは Standard CPP macros を参照してください.