| 原作者 | ケビン・ハモンド |
|---|---|
| 開発者 | サイモン・マーロウ、サイモン・ペイトン・ジョーンズ、グラスゴー・ハスケル・チーム[1] |
| 初回リリース | 1992年12月[2] |
| 安定版リリース | 9.10.1
/ 2024年5月10日[3] |
| リポジトリ |
|
| 書かれた | ハスケル、C |
| オペレーティング·システム | Linux、macOS Catalina [4]以降、Windows 2000以降、FreeBSD |
| プラットフォーム | x86-64、[4] AArch64 |
| 利用可能 | 英語 |
| タイプ | コンパイラ |
| ライセンス | BSD 3 節(新規) |
| Webサイト | 翻訳元: |
グラスゴーHaskellコンパイラ(GHC )は、関数型プログラミング言語Haskellのネイティブまたはマシンコード コンパイラです。[5] Haskellコードの作成とテストのためのクロスプラットフォームソフトウェア環境を提供し、コードの生成と実行のプロセスを効率化する多くの拡張機能、ライブラリ、最適化をサポートしています。GHCは最も一般的に使用されているHaskellコンパイラです。[6] 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へのサードパーティの貢献はIndustrial Haskell Groupによって資金提供されていた。[7]
GHC名
初期のリリース以来、公式ウェブサイト[8]ではGHCをThe Glasgow Haskell Compilerと呼んでいますが、実行可能バージョンコマンドではThe Glorious Glasgow Haskell Compilation Systemと識別されています。[9]これはドキュメントにも反映されています。[10]当初、内部名はThe Glamorous Glasgow Haskell Compilerでした。[11]
建築
GHCはHaskellで書かれていますが[12] 、プログラムを実行するために不可欠なHaskellのランタイムシステムはCとC--で書かれています。
GHCのフロントエンドは、字句解析器、パーサー、型チェッカーを組み込んでおり、型推論が完了するまでソース言語に関する情報を可能な限り保持するように設計されており、ユーザーに明確なエラーメッセージを提供することを目標としています。 [2]型チェックの後、Haskellコードは「Core」( System Fに基づき、および式で拡張)と呼ばれる型付き中間言語に脱糖されます。Coreは、その型システムで一般化された代数データ型をサポートするように拡張されており、現在はSystem Fの拡張であるSystem F Cに基づいています。[13]letcase
型指向コンパイルの伝統では、GHC の単純化器、つまり「中間端」は、GHC で実装されている最適化のほとんどが実行される場所で、コアコードに対する一連のソースからソースへの 変換として構造化されています。このコンパイラ段階で実行される分析と変換には、要求分析 (厳密性分析の一般化)、ユーザー定義の書き換えルールの適用 (foldr/build融合を実行する GHC の標準ライブラリに含まれる一連のルールを含む)、展開 (従来のコンパイラでは「インライン化」と呼ばれます)、let 浮動、どの関数引数をアンボックス化できるかを決定する分析、構築された積の結果分析、オーバーロードされた関数の特殊化、定数の折りたたみやベータ削減などの一連のより単純なローカル変換が含まれます。[14]
コンパイラのバックエンドは、中間言語 STG (「Spineless Tagless G-machine」の略) を介して、Core コードを C-- の内部表現に変換します。[ 15] C-- コードは、3 つのルートのいずれかを取ることができます。GCC でコンパイルするために C コードとして印刷されるか、ネイティブ マシン コードに直接変換されるか (従来の「コード生成」フェーズ)、 LLVM でコンパイルするためにLLVM IRに変換されます。3 つのケースすべてで、結果として得られたネイティブ コードは最終的に GHC ランタイム システムとリンクされ、実行可能ファイルが生成されます。
言語
GHCはHaskell 98 [16]とHaskell 2010 [17]の両方の言語標準に準拠しています。 また、Haskell標準に対する多くのオプションの拡張機能もサポートしています。たとえば、Composable Memory Transactionsを可能にするソフトウェアトランザクションメモリ(STM)ライブラリなどです。
Haskell の拡張
Haskellには多くの拡張機能が提案されています。これらは言語仕様に記述されていない機能を提供したり、既存の構造を再定義したりします。そのため、各拡張機能はすべてのHaskell実装でサポートされているわけではありません。拡張機能を記述し、将来のバージョンの言語仕様に含める拡張機能を選択するための 取り組みが進行中です[18] 。
グラスゴーHaskellコンパイラがサポートする 拡張機能[19]には以下のものがある。
- アンボックス型と操作。これらは、ヒープへのポインターの間接参照や遅延評価の可能性なしに、基盤となるハードウェアのプリミティブ データ型を表します。これらの型を使用してコード化すると、数値計算の多いコードが大幅に高速化されます。
- 値、パターン バインディング、またはデータ型フィールドの厳密な評価を指定する機能。
- モジュール、パターン、リストの内包表記、演算子、レコード、タプルを操作するためのより便利な構文。
- 矢印と再帰的に定義されたモナド値を使用して計算するための構文糖。これらの概念は両方とも、標準 Haskell で提供されているモナドのdo表記法を拡張します。
- 以下で説明する、型と型クラスの非常に強力なシステム。
- Template Haskell は、コンパイル時のメタプログラミングシステムです。式を記述して、抽象構文木の形式で Haskell コードを生成することができます。これらの式はコンパイル時に型チェックされ、評価されます。生成されたコードは、元のコードの一部であるかのように組み込まれます。定義を反映する機能と合わせて、これは言語をさらに拡張するための強力なツールとなります。
- 準引用符を使用すると、ユーザーは式やパターンの新しい具体的な構文を定義できます。準引用符は、Haskell で記述されたメタプログラムが Haskell 以外の言語で記述されたコードを操作する場合に便利です。
- 汎用型クラス。関数を、それが操作する型の代数構造のみに基づいて指定します。
- 複数の CPU コアを使用して式を並列評価します。明示的にスレッドを生成する必要はありません。作業の分散は、プログラムで提供される注釈に基づいて暗黙的に行われます。
- インライン展開や特定の型への関数の特殊化などの最適化を指示するコンパイラプラグマ。
- カスタマイズ可能な書き換えルールは、ある式を同等だがより効率的に評価される式に置き換える方法を記述したルールです。これらはコアデータ構造ライブラリ内で使用され、アプリケーションレベルのコード全体のパフォーマンスを向上させます。[20]
- レコードドット構文。他の多くのプログラミング言語の構文に似た、(潜在的にネストされた)レコードのフィールドにアクセスするための構文糖を提供します。 [21]
型システム拡張
表現力豊かな静的型システムは、Haskell の主要な特徴の 1 つです。したがって、言語を拡張する作業の多くは、データ型と型クラスに向けられてきました。
グラスゴーHaskellコンパイラは理論的なSystem F Cに基づく拡張型システムをサポートしています。[13]型システムの主な拡張には次のものがあります。
- 任意ランクおよび非予測的 多態性。本質的に、多態的関数またはデータ型コンストラクタでは、その引数の 1 つも多態的であることが要求される場合があります。
- 一般化された代数データ型。多態的データ型の各コンストラクタは、結果の型に情報をエンコードできます。この型にパターン マッチする関数は、コンストラクタごとの型情報を使用して、データに対してより具体的な操作を実行できます。
- 存在型。これらは、データとそのデータに対する操作を「バンドル」するために使用できます。これにより、基になるデータの特定の型を公開せずに操作を使用できます。このような値は、オブジェクト指向プログラミング言語にあるオブジェクトに非常に似ています。
- 実際には値を含まないデータ型。これらは、型レベルのメタプログラミングでデータを表すのに役立ちます。
- 型ファミリ: 型から型へのユーザー定義関数。パラメトリック ポリモーフィズムはすべての型のインスタンス化に対して同じ構造を提供しますが、型ファミリはインスタンス化ごとに異なる実装を持つアドホックポリモーフィズムを提供します。使用例には、コンテンツ認識型の最適化コンテナーや型レベルのメタプログラミングなどがあります。
- 動的スコープを持つ暗黙的な関数パラメータ。これらは、型クラスの制約とほぼ同じ方法で型で表現されます。
- 線形型(GHC 9.0)
型クラスに関連する拡張機能には次のものがあります。
- 型クラスは、複数の型にパラメータ化できます。したがって、型クラスは型のセットだけでなく、型上のn項関係も記述できます。
- 関数依存性は、その関係の一部を型に対する数学的な関数として制約します。つまり、制約は、他のパラメータ セットが固定されると、一部の型クラス パラメータが完全に決定されることを指定します。これにより、あいまいさが生じる状況で、型推論のプロセスがガイドされます。
- 型クラス インスタンスの許容される形状に関するルールが大幅に緩和されました。これらを完全に有効にすると、型クラス システムはコンパイル時に論理プログラミング用のチューリング完全な言語になります。
- 上で説明したように、型ファミリは型クラスに関連付けることもできます。
- 特定の型クラス インスタンスの自動生成は、いくつかの方法で拡張されています。汎用プログラミングと一般的な再帰パターン用の新しい型クラスがサポートされています。また、新しい型が既存の型と同型として宣言されている場合、基になる型に対して宣言された型クラス インスタンスは、新しい型に「無料で」持ち上げられる可能性があります。
ポータビリティ
GHCのバージョンは、 Windowsやほとんどの種類のUnix(Linux、FreeBSD、OpenBSD、macOSなど)を含むいくつかのシステムやコンピューティングプラットフォームで利用できます。 [22] GHCは、いくつかの異なるプロセッサアーキテクチャにも移植されています。[22]
参照
参考文献
- ^ ab "The GHC Team". Haskell.org . 2016年9月1日閲覧。
- ^ abc Hudak, P.; Hughes, J.; Peyton Jones, S .; Wadler, P. (2007 年 6 月). 「Haskell の歴史: クラスを怠けること」(PDF)。第 3 回 ACM SIGPLAN プログラミング言語の歴史に関する会議 (HOPL-III) の手順。2016年9 月 1 日閲覧。
- ^ 「ダウンロード – Glasgow Haskell コンパイラ」。Haskell.org。
- ^ ab 「32 ビット Darwin および Windows プラットフォームの廃止」。GHC チーム。
- ^ 「The Glorious Glasgow Haskell Compilation System ユーザーズガイド」。Haskell.org 。 2014年7月27日閲覧。
- ^ 「2017 年 Haskell の現状に関する調査結果」taylor.fausak.me 2017 年 11 月 15 日2017 年12 月 11 日閲覧。
- ^ 「Industrial Haskell Group」Haskell.org 2014年。 2016年9月1日閲覧。
- ^ 「GHC The Glasgow Haskell Compiler」. Haskell.org . 2022年1月14日閲覧。
- ^ “リポジトリ: configure.ac”. gitlab.haskell.org . 2022年1月12日. 2022年1月14日閲覧。
- ^ 「The Glorious Glasgow Haskell Compilation System User's Guide、バージョン7.6.3」。downloads.haskell.org 。 2022年1月14日閲覧。
- ^ "ghc-0.29-src.tar.gz" ( tar gzip ) . downloads.haskell.org . ファイル: ghc-0.29/ghc/PATCHLEVEL . 2022年1月14日閲覧。
- ^ 「GHC Commentary: The Compiler」. Haskell.org 2016年3月23日. 2016年3月23日時点のオリジナルよりアーカイブ。 2016年5月26日閲覧。
- ^ ab Sulzmann, M.; Chakravarty, MMT; Peyton Jones, S .; Donnelly, K. (2007 年 1 月)。「System F with Type Equality Coercions」。言語設計および実装における型に関する ACM ワークショップ (TLDI) の手順。
- ^ Peyton Jones, S. (1996 年 4 月)。「プログラム変換による Haskell のコンパイル: 現場からの報告」。ヨーロッパプログラミングシンポジウム (ESOP) の手順。
- ^ Peyton Jones, S. (1992 年 4 月). 「標準ハードウェア上での遅延関数型言語の実装: Spineless Tagless G マシン、バージョン 2.5」. Journal of Functional Programming . 2 (2): 127–202. doi :10.1017/S0956796800000319.
- ^ 「Haskell 98 言語とライブラリ: 改訂レポート」Haskell.org 。2007 年1 月 28 日閲覧。
- ^ 「Haskell 2010 言語レポート」Haskell.org 。2012年8 月 30 日閲覧。
- ^ 「Haskell へようこそ (Haskell Prime)」Haskell.org。2016 年 2 月 20 日時点のオリジナルよりアーカイブ。2016 年5 月 26 日閲覧。
- ^ 「GHC 言語機能」。Haskell.org。2016年 6 月 29 日時点のオリジナルよりアーカイブ。2016 年5 月 25 日閲覧。
- ^ Coutts, D.; Leshchinskiy, R.; Stewart, D. (2007 年 4 月)。「Stream Fusion: From Lists to Streams to Nothing at All」。ACM SIGPLAN International Conference on Functional Programming (ICFP) の手順。2007 年 9 月 23 日時点のオリジナルよりアーカイブ。
- ^ Mitchell, Neil; Fletcher, Shayne (2020 年 5 月 3 日). 「レコード ドット構文」. ghc-proposals . GitHub . 2020 年6 月 30 日閲覧。
- ^ ab プラットフォーム at gitlab.haskell.org
外部リンク
- 公式サイト
