Glasgow Haskell Compiler ( GHC ) は、関数型プログラミング言語Haskell用のネイティブまたはマシンコードコンパイラです。[ 6 ] Haskell コードの記述とテストのためのクロスプラットフォームのソフトウェア環境を提供し、コードの生成と実行のプロセスを効率化する多くの拡張機能、ライブラリ、最適化をサポートしています。GHC は最も一般的に使用されている Haskell コンパイラです。[ 7 ] BSD ライセンスの下でリリースされた無料のオープンソースソフトウェアです。
GHC は元々 1989 年にグラスゴー大学の Kevin Hammond によってLazy ML (LML)で書かれたプロトタイプとして始まりました。その年の後半に、Cordelia Hall、Will Partain、Simon Peyton Jones によって、パーサーを除いてプロトタイプ全体が Haskell で書き直されました。最初のベータ版は 1991 年 4 月 1 日にリリースされました。後のリリースでは、厳密性アナライザーや、モナド I/O 、可変配列、アンボックス化データ型、並行および並列プログラミング モデル (ソフトウェア トランザクショナル メモリやデータ並列性など) 、プロファイラなどの言語拡張機能が追加されました。[ 2 ]
ペイトン・ジョーンズとマーロウは後にケンブリッジのマイクロソフト・リサーチに移り、そこで引き続きGHCの開発を主に担当した。GHCには300人以上の貢献者によるコードも含まれている。[ 1 ] 2009年から2014年頃までは、GHCへの第三者による貢献はインダストリアル・ハスケル・グループによって資金提供されていた。[ 8 ]
初期リリース以来、公式ウェブサイト[ 9 ]ではGHCをThe Glasgow Haskell Compilerと呼んでいますが、実行可能バージョンのコマンドではThe Glorious Glasgow Haskell Compilation Systemと識別されています。[ 10 ]これはドキュメントにも反映されています。[ 11 ]当初は、内部名がThe Glamorous Glasgow Haskell Compilerでした。[ 12 ]
GHCはHaskellで書かれていますが[ 13 ]、プログラムを実行するために不可欠なHaskellのランタイムシステムはCとC--で書かれています。
GHC のフロントエンドは、字句解析器、構文解析器、型チェッカーを組み込んでおり、型推論が完了するまでソース言語に関する情報をできるだけ多く保持し、ユーザーに明確なエラーメッセージを提供することを目的としています。[ 2 ]型チェックの後、Haskell コードは「Core」と呼ばれる型付き中間言語に脱糖されます( System Fをベースに、式を追加)。Core は、その型システムで一般化された代数的データ型をサポートするように拡張されており、現在は System F の拡張である System F Cをベースにしています。[ 14 ]letcase
型指向コンパイルの伝統に従い、GHC のシンプリファイア、つまり「中間部」は、 GHC で実装されている最適化のほとんどが実行される場所であり、コア コードに対する一連のソース間変換として構成されています。このコンパイラ ステージで実行される分析と変換には、要求分析 (厳密性分析の一般化)、ユーザー定義の書き換えルールの適用 (foldr/build融合を実行する GHC の標準ライブラリに含まれる一連のルールを含む)、展開 (より伝統的なコンパイラでは「インライン化」と呼ばれる)、 let フローティング、どの関数引数をアンボックスできるかを決定する分析、構築された積の結果分析、オーバーロードされた関数の特殊化、定数折りたたみやベータ削減などのより単純なローカル変換のセットが含まれます。[ 15 ]
コンパイラのバックエンドは、中間言語 STG (「Spineless Tagless G-machine」の略) を介して、 Core コードをC--の内部表現に変換します。 [ 16 ] C-- コードは、次の 3 つの経路のいずれかをたどります。GCC でコンパイルするために C コードとして出力されるか、ネイティブ マシン コードに直接変換される (従来の「コード生成」フェーズ)、またはLLVM でコンパイルするためにLLVM IRに変換されます。いずれの場合も、結果として得られたネイティブ コードは、最終的に GHC ランタイム システムとリンクされ、実行可能ファイルが生成されます。
GHC は、 Haskell 98 [ 17 ]とHaskell 2010 [ 18 ]の両方の言語標準に準拠しています。 また、Haskell 標準への多くのオプションの拡張機能もサポートしています。たとえば、構成可能なメモリ トランザクションを可能にするソフトウェア トランザクショナル メモリ(STM) ライブラリなどです。
Haskellには多くの拡張機能が提案されています。これらは言語仕様に記載されていない機能を提供したり、既存の構成要素を再定義したりします。そのため、すべての拡張機能がすべてのHaskell実装でサポートされているとは限りません。拡張機能を記述し、将来の言語仕様バージョンに含める拡張機能を選択する取り組みが現在進行中です[ 19 ] 。
グラスゴーHaskellコンパイラがサポートする拡張機能[ 20 ]には以下が含まれます。
表現力豊かな静的型システムは、Haskellの主要な特徴の一つです。そのため、言語拡張作業の多くは、データ型と型クラスに向けられてきました。
グラスゴーHaskellコンパイラは、理論的なSystem F Cに基づいた拡張型システムをサポートしています。[ 14 ]型システムへの主な拡張には以下が含まれます。
型クラスに関連する拡張機能には以下が含まれます。
GHC のバージョンは、 WindowsやほとんどのUnix系( Linux、FreeBSD、OpenBSD、macOSなど)を含む、いくつかのシステムまたはコンピューティング プラットフォームで利用可能です。 [ 23 ] GHC は、いくつかの異なるプロセッサ アーキテクチャにも移植されています。[ 23 ]