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. 言語拡張

  • -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 クラスに対してしか効きませんが BoolNum のインスタンスではないからです. 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 参照).
  • 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).

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 ハンドルをリダイレクトできるようになりました.