Glasgow Haskell Compiler

Glasgow Haskell Compiler (グラスゴー・ハスケル・コンパイラ)[4] またはThe Glorious Glasgow Haskell Compilation System (ザ・グロリアス・グラスゴー・ハスケル・コンピレーション・システム)[5] は、関数型プログラミング言語 Haskellオープンソースコンパイラである。一般的にGHCの略称で知られている。Haskellのコードの作成とテストのためのクロスプラットフォーム環境を提供し、効率的な実行ファイルを生成するための多数の言語拡張・ライブラリ最適化に対応している。GHCは最も一般的に利用されているHaskellのコンパイラである[6]。主要開発者はSimon Peyton JonesSimon Marlow英語版である。

Glasgow Haskell Compiler
作者 Kevin Hammond
開発元 The Glasgow Haskell Team[1]
初版 1992年12月 (28年前) (1992-12)[2]
最新版 9.0.1[3] ウィキデータを編集 - 2021年2月4日 (4か月前) (2021-02-04)
リポジトリ ウィキデータを編集
プログラミング
言語
対応OS クロスプラットフォーム
プラットフォーム
対応言語 英語
種別 コンパイラ
ライセンス 修正BSDライセンス
公式サイト www.haskell.org/ghc/ ウィキデータを編集
テンプレートを表示

歴史編集

GHCの開発は、1989年グラスゴー大学のKevin Hammondによって開始された。プロトタイプLazy ML英語版によって書かれていた。この年の後半にパーサを除いた部分が、Cordelia HallとWill PartainとSimon Peyton JonesによってHaskellで完全に書き直された。最初のベータ版1991年4月1日にリリースされ、その次のリリースでは、厳密なアナライザーとモナドなどのより良い言語拡張、変更可能な配列 (MArray)、ボックス化されていないデータ型ソフトウェアトランザクショナルメモリデータ並列性などの並列プログラミングモデルプロファイラーが追加された[2]

Simon Peyton JonesとSimon Marlowは後に、ケンブリッジマイクロソフトリサーチに移籍し、そこでGHCの開発を行っている。GHCの開発には300人以上が貢献している[1]2009年以降、サードパーティーのGHCへの貢献には、Industrial Haskell Group (IHG) によって資金提供が行われている[7]

アーキテクチャ編集

GHC自体はHaskellによって書かれている[8]プログラムの実行に必要なランタイムシステムは、C言語C--によって書かれている。

字句解析・パーサ・型システムが組み込まれているGHCのフロントエンドは、型推論が完了するまで可能な限りソースコードに関する情報を保存し、ユーザーに明確なエラーメッセージを提供することを目標に設計されている[2]。型検査が完了した後、Core[注釈 1]として知られている非糖衣構文の型付きの中間言語に変換される。最近のCoreは一般化代数的データ型英語版に対応するように拡張され、System FCとして知られているSystem Fの拡張に基づいている[9]

型指向コンパイルの伝統では、GHCのコンパイラ最適化が実行される単純化 (ミドルエンド) の段階は、一連のCoreのコードのトランスコンパイルによって構成されている。この段階で行われる解析と変換は、需要解析 (正格性解析英語版[要リンク修正]の一般化)、ユーザー定義の項書き換えの適用 (foldr/build融合英語版を実行するGHCの標準ライブラリに含まれる一連の規則を含む)、展開 (より伝統的なコンパイラでは「インライン展開」と呼ばれているもの)、ボックス化を解除できる関数引数がどれであるかの解析、構築された製品の結果解析英語版多重定義された関数の部分評価定数畳み込みベータ簡約などのより簡単な局所変換である[10]

GHCのバックエンドは、中間言語 Spineless Tagless G-machine (STG) を介してCoreのコードをC--の内部表現に変換している[11]。C--のコードは以下の3つの中のいずれかの方法によって変換される[12]

  1. GCCでコンパイルするためのC言語のコードを出力。
  2. 機械語に直接変換 (従来のコード生成)。
  3. LLVMでコンパイルするための中間言語 (LLVM IR) に変換。

いずれの方法でも最終的に得られた機械語はGHCのランタイムシステムとリンクされ、実行ファイルが生成される。

言語編集

GHCはHaskell 98Haskell 2010の両方の言語標準に対応している[13][14]。また、言語標準に対する多くの言語拡張にも対応している。例えば、合成可能メモリトランザクションを可能にするソフトウェアトランザクショナルメモリ (STM) のライブラリである。

言語拡張編集

Haskellの言語標準には幾つかの拡張が提案されている。これらの言語拡張は言語仕様では記述されていない機能を提供するか、既存の構造を再定義している。これらの言語拡張は全てのHaskell処理系が対応しているわけではない。言語拡張を記述し、将来の言語仕様に含めるものを選択する継続的な努力が行われている[15]

GHCが対応している言語拡張は以下の通りである[16]

  • ボックス化されていない型と操作。これらはヒープへのポインタ間接参照遅延評価の可能性を除外して、基礎となるハードウェアプリミティブ型を表す。数多くのコードは、これらの型を使用することにより大幅な高速化が可能である。
  • 、パターン・バインディング、データ型領域の正格評価を指定する機能。
  • モジュール・パターン・リスト内包表記演算子・レコード・タプルの操作により便利な構文。
  • 矢印を使用して計算するための糖衣構文と再帰的に定義されたモナドの値。これらはどちらも言語標準のモナドのdo-notationを拡張している。
  • Template Haskell英語版は、コンパイル時のメタプログラミングのためのシステムである。プログラマ抽象構文木の形でHaskellのコードを生成するを書くことができる。これらの式はコンパイル時に型検査が行われる。生成されたコードはプログラマによって直接書かれたように見える。定義に反映するための能力と共に、更なる言語拡張のための強力なツールを提供する。
  • 擬似引用英語版を利用することで、ユーザーは式とパターンのための新しい具体的な構文を定義することができる。この機能は、Haskellで書かれたメタプログラムが、Haskell以外で書かれたコードを操作する場合に便利である。
  • ジェネリック型クラスは、操作する型の代数的構造だけで関数を指定する。
  • 複数のコアを利用した式の並列評価。この機能では明示的にスレッドを指定する必要はない。プログラマが提供する注釈に基づいて、暗黙的に作業の分散が行われる。
  • インライン展開などの最適化を指示するコンパイラプラグマと、特定型のための特殊関数
  • 変更可能な項書き換え。プログラマはある1つの式を、等価なより効率的に評価された式に置き換える方法を記述するルールを提供することができる。この機能は、アプリケーションレベルのコード全体で、データ構造ライブラリの中心部を効率化するために利用されている[17]

型システムの拡張編集

表現力豊かな静的型付けは、Haskellの主な特徴の1つである。それ故に、言語拡張の作業の多くは型と型クラスに向けたものになっている。

GHCはSystem FCに基づいた拡張型システムに対応している[9]。主な型システムの拡張は以下の通りである。

  • 任意ランクと非可述的多相性。本質的には、多相関数またはデータ型コンストラクタは、引数の1つが多相であることを必要とする場合がある。
  • 一般化代数的データ型。多相データ型の各コンストラクタは、結果の型に情報をエンコードすることができる。この型でパターンマッチを行う関数は、コンストラクタごとの型情報に基づいて、データに対してより具体的な操作を行うことができる。
  • 存在型は、一部のデータとそのデータの操作を束ねて、基礎となるデータのデータ型を隠蔽して操作することができる。このような値は、オブジェクト指向プログラミングオブジェクトと非常に似たものである。
  • 値を含まないデータ型。この機能は型レベルのメタプログラミングでデータを表現するときに便利である。
  • 型族英語版は、型から型へのユーザー定義関数である。パラメータ多相は各型のインスタンス化に同じ構造を提供するが、型族はインスタンス間で異なる実装によりアドホック多相を提供する。ユースケースには、内容に応じたコンテナの最適化と、型レベルのメタプログラミングが含まれている。
  • 動的スコープを持つ暗黙的な関数パラメータ。これは型クラスの制約と同様に、型で表現される。

型クラスに関する拡張は以下の通りである。

  • 型クラスは複数の型によってパラメータ化することができる。従って、型クラスは型の組だけでなく、n-項関係を記述することができる。
  • 関数従属性は、その部分の関係を型の数学的関数に制約する。つまり、ある型タイプの一方のパラメータが固定されると、もう一方のパラメータが完全に決定するように束縛が指定される。これは曖昧さがある状況で型推論ができる方法を案内する。
  • 型クラスのインスタンスの許容できる形状に関するルールを大幅に緩めた。これが全て有効なとき、型クラスシステムはコンパイル時に論理プログラミング向けのチューリング完全な言語となる。
  • 型族は型クラスに関連付けることができる。
  • 確実な型クラスのインスタンスの自動生成は、幾つかの方法で拡張されている。ジェネリックプログラミングと一般再帰パターン向けの新たな型クラスに対応している。更に、新しい型が既存の型と同じであると宣言された場合、基の型に対して宣言された型クラスのインスタンスは、空の新しい型に昇格する可能性がある。

移植性編集

GHCはUnix系OS (LinuxFreeBSDmacOSなど) やWindowsなど多くのプラットフォームで動作し[18]パッケージ管理システムを利用してインストールすることもできる[19]。また、x86PowerPCなど数多くの命令セットアーキテクチャに移植されている[20]

脚注編集

[脚注の使い方]

注釈編集

  1. ^ System Fに基づいており、letcaseで拡張されている。

出典編集

  1. ^ a b The Glasgow Haskell Team”. ghc.haskell.org. 2018年11月9日閲覧。
  2. ^ a b c A History of Haskell: Being Lazy With Class (PDF)”. Microsoft Research (2007年4月16日). 2018年11月9日閲覧。
  3. ^ "GHC 9.0.1 download"; 閲覧日: 2021年2月11日.
  4. ^ Glasgow Haskell Compiler User's Guide”. downloads.haskell.org. 2018年11月9日閲覧。
  5. ^ ghc --version
  6. ^ Taylor Fausak (2017年11月15日). “2017 state of Haskell survey results”. 2018年11月9日閲覧。
  7. ^ Industrial Haskell Group”. industry.haskell.org. 2018年11月9日閲覧。
  8. ^ GHC Commentary: The Compiler”. ghc.haskell.org. 2018年11月9日閲覧。
  9. ^ a b System F with Type Equality Coercions (PDF)”. Microsoft Research (2011年1月19日). 2018年11月9日閲覧。
  10. ^ Simon Peyton Jones (1996年). “Compiling Haskell by program transformation: A report from the trenches (PDF)”. Springer. 2018年11月9日閲覧。
  11. ^ Simon Peyton Jones (1992年6月9日). “Implementing Lazy Functional Languages on Stock Hardware: The Spineless Tagless G-machine (PDF)”. Microsoft Research. 2018年11月9日閲覧。
  12. ^ I know kung fu: learning STG by example”. ghc.haskell.org. 2018年11月10日閲覧。
  13. ^ Simon Peyton Jones (2002年12月). “The Haskell 98 Language Report”. haskell.org. 2018年11月9日閲覧。
  14. ^ Simon Marlow. “Haskell 2010 Language Report”. haskell.org. 2018年11月9日閲覧。
  15. ^ Haskell Prime”. prime.haskell.org. 2018年11月9日閲覧。
  16. ^ GHC Language Features”. downloads.haskell.org. 2018年11月9日閲覧。
  17. ^ Stream Fusion. From Lists to Streams to Nothing at All (PDF)”. CiteSeerX (2007年). 2018年11月10日閲覧。
  18. ^ Platforms”. ghc.haskell.org. 2018年11月10日閲覧。
  19. ^ Distribution Packages”. haskell.org. 2018年11月10日閲覧。
  20. ^ GHC Code Owners”. ghc.haskell.org. 2018年11月10日閲覧。

関連項目編集

外部リンク編集