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 home page
- GHC Developers Home (開発者用文書,wiki,バグトラッカー)
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.20040225
は6.8
ブランチのスナップショットで,6.8.2
の開発中に作るものです.スナップショットリリースでは
__GLASGOW_HASKELL__
の値は(安定版のときと同様)xy
となります. しかし,この値をチェックする条件コードを書いてはいけません. インターフェイスは日毎に変わるにもかかわらず__GLASGOW_HASKELL__
では, これ以上細かい精度の値を表せませんから__GLASGOW_HASKELL__
の値をチェックするなら メジャーリリース番号との間でだけ大小・等値比較を行ってください.
HEAD
のスナップショットリリースは ダウンロード できるようにし,最新のソースは the git repositories で利用できるようにします.不安定版スナップショットリリースは
x.y.YYYYMMDD
という名前になります. ここで,YYYYMMDD
はスナップショットのビルド元になったソースの日付けです. たとえば6.7.20040225
はHEAD
のスナップショットで6.8
ブランチ を作成する前の段階で作成します.スナップショットリリースでは
__GLASGOW_HASKELL__
の値は(安定版のときと同様)xy
となります. しかし,この値をチェックする条件コードを書いてはいけません. インターフェイスは日毎に変わるにもかかわらず__GLASGOW_HASKELL__
では, これ以上細かい精度の値を表せませんから__GLASGOW_HASKELL__
の値をチェックするなら メジャーリリース番号との間でだけ大小・等値比較を行ってください.
手元のGHCのバージョン番号は ghc
を --version
フラグ付きで起動すれば判ります
(Verbosity options 参照).
コンパイラのバージョンはコンパイルするコードの中でチェックできます.
これは CPP のマクロ MIN_VERSION_GLASGOW_HASKELL
を使います
(このマクロは -XCPP
が指定されたときのみ有効です).
詳しくは Standard CPP macros を参照してください.