GHC7.8.1リリースノート意訳

GHC7.6系からGHC7.8系でいろいろ新機能もりもりですが、勉強のために7.8.1のリリースノート読んで意訳してみた。特に正確な直訳というわけではなく、説明のため若干行間補足したり、適当に端折ったりしている箇所あるけど、おかしなところあればご指摘ください。正確な記載は原文参照↓
http://www.haskell.org/ghc/docs/7.8.1-rc1/html/users_guide/release-7-8-1.html


Release notes for version 7.8.1
7.6系から7.8.1での主な変更点は以下のとおり。またいろいろバグFIXやパフォーマンス改善もしてる。

<主な変更点>

  • デフォルトで新しいオプション-warn-typed-holesが有効になった。これは未定義変数の型を出力する。(訳注:なので型が知りたい場所を未定義変数を置いてコンパイルするとGHCにより型が推論されて型を教えてくれる)。これはプログラミング言語Agdaのholes機能みたいなものである。詳細は7.1章Typed Holes参照。
  • DataKinds拡張で、型レベルで自然数の単純な評価ができるようになった。例えば型レベルの制約 (x + 3) ~ 5が与えられたとき、GHCはxが2であることが推論できる。同様にGHCはx + 0 ~ xのような型レベルの同一性も理解する。これらの等式は変数を単一化するのに使われるが、型検査で新しい要素を生成するのではない。これは関数従属がどのように機能するのかと同様である。(訳注:結局どういうことだってばよ?)
  • TypeFamilies拡張で閉じた型族が定義できるようになった。閉じた型族では定義外のインスタンスを生成することができない。詳細は7.7.2.3章Closed type families参照。
  • GeneralizedNewtypeDeriving拡張を使用する場合、導出されたインスタンスの型安全のためロールチェックするようになった。以前コンパイルできたコードがコンパイルできないかもしれない。詳細は7.24章Roles参照。
  • XPatternSynonyms拡張でパターンシノニムがサポートされた。パターンに名前を付けて抽象化できるようになった。詳細は7.3.8パターンシノニム参照。GHC7.8.1ではこの機能はプレビュー扱いであることに注意。
  • 型推論エンジンと制約解決器を大幅に作りなおした。より速く省メモリになった。
  • デフォルトで小さな正格フィールドは非ボックス化されるようになった。"小さな"データとはマシンのワードサイズと同じまたはそれ以下のサイズのものである。このため正格のIntフィールドをUNPACKプラグマで明示する必要はない。これは浮動小数点の値にも適用される。
  • I/Oマネージャが刷新され大量処理の性能が向上した。32コアまでリニアにスケールする。
  • LLVMバックエンドは128bit,256bit SIMD命令をサポートした。これはLLVMでのみ利用可能で、実験段階のものであることに注意。
  • 新しいコード生成器がたくさんの人々の長年の成果を経てついにデフォルトになった。これはSTGからCmmへの変換を完全に書きなおした。一般的に言ってあなたのプログラムはちょっと速くなるかも。古いコード生成器は完全に取り除かれた。
  • 即値のPrimOpsはBoolの代わりにInt#を返すようになった。これは後方非互換な変更である。既存のコードをどのように変更すればよいかはこのGHCのwikiページを参照。変更に至った動機と実装詳細の議論はこちらを参照。
  • アトミックなメモリ操作のPrimOpsが新しくなった。casMutVar#はGHC7.2で導入され7.4でデバッグされた。7.8ではcompare-and-swap(casArray#とcasIntArray#) 、fetch-and-add(fetchAddIntArray#)のPrimOpsが追加された。
  • Linux, FreeBSD, Mac OS XではGHCiはデフォルトで動的リンクを使用するようになった。これはクロスプラットフォームがより強力になり多くの長年のバグが修正された。(コンストラクタ、デストラクタ、weekシンボルなどが正しく機能し、RTSのいくつもの稀なバグが修正された。この結果、GHCi(とTemplate Haskell) は動的なオブジェクトファイルをロードしなければならない。これを支援するため新しいコンパイルフラグ-dynamic-tooを使用すると静的と動的の両方のオブジェクトファイルが同時に生成される。GHC自身は依然としてデフォルトで静的リンクである。Cabalは-dynamic-tooフラグを正しく処理できるが、TemplateHaskell拡張を使用している場合はCabalに明示的に-XTemplateHaskellオプションを指定する必要がある。現状Dynamic GHCiと-dynamic-tooフラグはWindowsではサポートされない。
  • Typeableは多相種になった。Typeable1,Typeable2などはもはや使用されず非推奨であり、Data.OldTypeableに追いやられた。さらにユーザ定義のTypeableインスタンスは許可されない。deriving句を使用するか-XAutoDeriveTypeableオプションを使用することでモジュール内に定義されたすべてのデータ型のTypeableインスタンスを生成することができる。
  • GHCは新しいプラグマ{-#MINIMAL #-}がサポートされた。明示的に最小で完全なクラスを定義することができる。最小でないインスタンス定義は警告される。
  • GHC7.10ではApplicativeはMonadスーパークラスになる予定である。この変更は多くのユーザコードを破壊する可能性がある。この移行を緩和するためGHCはApplicative-Monad則(AMP)に矛盾する定義に警告するようになった。MonadインスタンスであるがApplicativeでないもの、MonadPlusであるがAlternativeでないもの、ローカル関数でjoin, <*>, またはpureの名前が定義されているものが警告される。この警告はデフォルトで有効で新たな-f[no-]warn-ampフラグで制御可能。
  • 新しいInterruptibleFFI拡張を使用すると割り込み可能なFFIが定義できる。割り込み可能な外部呼び出しはsafe callと同じであるが、throwToやtimeoutのような非同期なHaskell例外で割り込みされるかもしれない。詳細は8.1.4Interruptible foreign callsを参照。
  • GHCの内部コンパイラパイプラインがGHC API内のHooksモジュールとして利用できるようになった。hooksを使用することで式のコンパイル、フェーズ制御、リンクを含む大部分の内部コンパイル機構を制御できる。インターフェースは継続的に変更されAPIは将来のリリースで変更される可能性が高くプレビュー扱いであることに注意すること。
  • LLVMコード生成器は動的リンクをサポートするよう修正された。これはGHC自身のランタイムリンカーのサポートがないアーキテクチャ(ARMなど)で、ランタイムリンク(GHCiなど)をサポートする。組み込みのldのバグでARMでビルドする場合はTables-next-to-codeは無効化されることに注意。

<すべての変更点詳細>
力尽きたので未訳。