4. バージョン 8.0.2 のリリースノート¶
コンパイラのさまざまな重大な変更箇所については次節以降で網羅します. 8.0.1 にあった大量のバグの修正と性能改善を行いました.
Warning
このリリースでは,Cabal のバージョン 1.24 以降でないと正しく機能しません(Trac #11558 参照).
したがって,新しいパッケージをインストールする前に cabal-install
を再コンパイルする必要があります.
理由は GHC 8.0 でパッケージの識別方法が変更になったからです.
Cabal の以前のバージョンでは,GHCのパッケージを(GHC の -this-package-key
引数を使って)
パッケージキーで識別していましたが,GHC 8.0 以降ではパッケージキーの代りにインストール済みパッケージ
ID を使います.
Note
ユーザーが Mac OS X で XCode 7.3 を使って GHC をコンパイルするには,ビルドシステムに
Apple の新しい nm
コマンドではなく nm-classic
コマンドを使うように指示しなければなりません.
新しい nm
コマンドは POSIX の規約を破っているからです.
(Trac #11744 参照).
指示は configure
コマンドに --with-nm=$(xcrun --find nm-classic)
のように指定します.
4.1. ハイライト¶
8.0.1 のリリースからの変更のハイライトは以下のとおりです.
- macOS Sierra および,最近の Linux のディストリビューションでの互換性を修正
- たくさん,たくさんのバグ修正
- 単一構成子をもつ GADT を
Ix
のインスタンスとしてスタンドアロン導出しようとすると失敗するバグを修正(Trac #12583).
- GHCが生成するインターフェイスファイルは決定的でなければならなくなりました.
4.2. 詳細¶
4.2.1. 言語拡張¶
-XRebindableSyntax
および-XOverloadedStrings
が指定されている場合にShow
インスタンスの導出に失敗するバグを修正 (Trac #12688).
-XGeneralizedNewtypeDeriving
を指定することで生成する型検査コードがより厳格になりました. たとえば,以下のプログラムは GHC が拒絶します.class C m where foo :: C m => m () newtype N m a = N (m a) deriving C -- This is now an error
GHC 8.0.1 以前はこのコードは通っていました. 単に
foo
にある全く不要のC m
制約を削除するだけで,このコードは修正できます.class C m where foo :: m ()
-XDefaultSignatures
を使ってプログラムで GHC 8.0.1 では正しく型検査ができないものがありましたが, GHC 8.0.2 はこれをリジェクトするようになりました. それを示す例を以下に挙げます.class Monad m => MonadSupply m where fresh :: m Integer default fresh :: (MonadTrans t, MonadSupply m) => t m Integer fresh = lift fresh instance MonadSupply m => MonadSupply (IdentityT m)
デフォルトのタイプシグネチャの
m
とデフォルトのタイプシグネチャではない部分のm
は全く違う使い方です. これを(後方互換性のある方法で)修正するには以下のように書きます.class Monad m => MonadSupply m where fresh :: m Integer default fresh :: (MonadTrans t, MonadSupply m', m ~ t m') => m Integer -- Same 'm Integer' after the '=>' fresh = lift fresh
デフォルトの型クラスメソッド実装とオーバーラッピングインスタンスを組み合わせているプログラムの一部は 型検査に失敗するようになりました.以下はその例です.
class Foo a where foo :: a -> [a] foo _ = [] instance Foo a instance Foo Int
問題はオーバーラッピングインスタンス
Foo Int
に明示的にオーバーラッピングを示すマークが付いていないことです. これを修正するには,単にOVERLAPPING
プラグマを加えるだけです.instance {-# OVERLAPPING #-} Foo Int
GHC はデフォルト規則に関して,より Haskell 2010 Report に近くなりました. その結果,GHC はバージョン 8.0.1 以前には受け入れていたいくつかのデフォルト規則を拒絶するようになりました. たとえば,以下は拒絶されます.
module Foo where default (Bool)
その理由は
-XExtendedDefaultRules
拡張が有効になっていなければ, デフォルト規則はNum
クラスに対してしか効きませんがBool
はNum
のインスタンスではないからです. GHC がこれを受け入れるようにするには-XExtendedDefaultRules
拡張を有効にするだけです.
4.2.2. コンパイラ¶
- 8.0.1 にあった,いくつかのパッケージをコンパイル中に未定義参照エラーになるというバグを修正しました (Trac #12076 参照).
- コンパイル済みのプログラムでセグメンテーションフォルトがでるというコード生成器のバグを修正しました (ghc-ticket:12757 参照).
- GHC はデフォルトで,位置独立実行可能コードを生成する C コンパイラシステムをサポートするようになりました (Trac #12579 参照).
- GHC はデフォルトで
gold
リンカを使うシステムでビルドできるようになりました (Trac #12816 参照).
- GHC は macOS Sierra でちゃんと走るようになりました. Sierra が導入したリンカの制限を,大量のパッケージ依存があるプログラムをコンパイルするときに GHC が超えてしまうことがありました(Trac #12479 参照).
-Wredundant-constraints
フラグを-Wall
フラグ集合から削除しました (Trac #10635).
-fdefer-out-of-scope-variables
フラグを追加しました. このフラグは範囲外変数エラーを警告に変えます.
- RTS の
-xb
はベースのヒープアドレスを任意の基数で読むようになりました. デフォルトでは10進,0x
ではじまるアドレスは16進0
ではじまるアドレスなら8進として読みます.
- とある見落としのせいで,GHC 8.0.1 では,GHCが使う LLVM のバージョンを表すプリプロセッサマクロ
__GLASGOW_HASKELL_LLVM__
の値が整数でなくなっていました. この値を整数に戻しました.ただし,フォーマットは__GLASGOW_HASKELL__
のやりかたに沿ったものに変更しました (Trac #12628).
- ウィークメモリコンシステンシを保証するプラットフォーム上の並列プログラムの信頼性が大幅に向上しました (Trac #12469).
- 所定のビルドでは,インターフェイスファイルはビット単位で同一になるはずです (Trac #4012).
- 200を超えるバグを修正しました. Trac がその一覧です.
4.2.3. ランタイムシステム¶
- Windows 上のランタイムリンカは,再び「非推奨」名のPOSIX関数を識別するようになりました. たとえば strdup で識別して内部的には _strdup に転送します. 既存のコードで正しい名前を(たとえば _strdup)使っている場合,それはそのままで変更する必要はありません. この転送がどのように行われてりうかの詳細については MSDN を参照してください. これでコンパイル済みのコードとインタプリタを通したコードの振る舞いは同じになるはずです (Trac #12497 参照).
- コスト集約点プロファイラが出力するプロファイルにソース位置情報が含まれるようになりました (see Trac #11543).
- 新しい
-qn
フラグを使えば,可能なスレッド数とは独立して, ガーベッジコレクションに使うスレッドの数を設定できます.
- 可能なスレッド数が大きいときのランタイムシステムの起動頻度が少くなりました.
- ランタイムシステムがたくさんのスレッドに割り当てられたプログラムをより効率よく ハンドリングできるようになりました(Trac #12419).
- クラッシュにつながる可能性のあったランタイムシステムのバグをいくつも修正しました (詳細は Trac #12728, Trac #10860, Trac #12019, Trac #11978, Trac #12038, Trac #12208 参照).
4.2.4. Template Haskell¶
addModFinalizer
は当該のスプライスポイントにおけるローカル型付け環境を表すようになりました. これにより以下のようにreify
から現在の宣言グループにおけるローカルおよびトップレベルの定義が見えるようになります.f x = $(addModFinalizer (reify 'x >>= runIO . print) >> [| x |])
4.2.5. ghc
library¶
ErrUtils.ErrMsg
およびErrUtils.ErrDoc
のアクセサをエクスポートしました.
- API ユーザが
createIservProcessHook
を使ってstdout
およびstderr
ハンドルをリダイレクトできるようになりました.