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やパフォーマンス改善もしてる。
<主な変更点>
- Mac OS X Mavericks+XCode5環境がサポートされた。GHCはMavericksではデフォルトでClangをプリプロセッサとして使うようになった。GHCは他のプラットフォームでは通常gccをプリプロセッサとして使うことに注意。gccの互換性オプション-traditionalはClangと100%互換があるわけではない。Clangをプリプロセッサとして使う場合-XCPPオプション使ったプログラムはコンパイル失敗するかもしれない。以前の挙動を保ちたいならとりあえずcpphs(訳注:CプリプロセッサのHaskell実装)を使った方がよい。将来的にはCコンパイラに依存しないプリプロセッサ(たぶんcpphs自身)によってこの問題を解決したい。
- デフォルトで新しいオプション-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参照。
- OverloadedList拡張でリストリテラルがオーバーロードできるようになった(訳注:要するにSetとかMapのリテラルが書けるようになった)。詳細は7.6.5Overloaded lists参照。
- XPatternSynonyms拡張でパターンシノニムがサポートされた。パターンに名前を付けて抽象化できるようになった。詳細は7.3.8パターンシノニム参照。GHC7.8.1ではこの機能はプレビュー扱いであることに注意。
- 型推論エンジンと制約解決器を大幅に作りなおした。より速く省メモリになった。
- デフォルトで小さな正格フィールドは非ボックス化されるようになった。"小さな"データとはマシンのワードサイズと同じまたはそれ以下のサイズのものである。このため正格のIntフィールドをUNPACKプラグマで明示する必要はない。これは浮動小数点の値にも適用される。
- I/Oマネージャが刷新され大量処理の性能が向上した。32コアまでリニアにスケールする。
- 新しいコード生成器がたくさんの人々の長年の成果を経てついにデフォルトになった。これは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は並列コンパイルできるようになった。-makeでコンパイルする場合(デフォルト動作)、-jNオプションでN個のモジュールを並列でコンパイルできる。(コンパイラに+RTS -Nを指定しなくてもマルチコアマシンであれば自動でスケールする)
- 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は無効化されることに注意。
<すべての変更点詳細>
力尽きたので未訳。