3. バージョン 8.2.1 のリリースノート

コンパイラのさまざまな部分での重要な変更は以降の節で一覧表にしてあります. 8.0 ブランチに対して大量のバグ修正と性能改善を行いました.

3.1. ハイライト

8.0 系列からの変更のハイライトは以下のとおりです.

  • より表現力のある Typeable 機構, Type.Reflection を新しく追加しました.
  • エラーメッセージが色付きになり,カレット(^)マークが付くようになりました.
  • 宣言に対して SCC 注釈が付けられるようになりました.
  • 特定の状況でヒープオーバーフローの際に例外を投げるようにしました.
  • 結合点のコード生成を改良しました.
  • 自動導出の戦略指定を可能にしました.
  • コンパクトリージョンをサポートし,大きなヒープの GC を効率良く行なえるようにしました.
  • DWARF形式のデバッグ情報の信頼性を向上しました.

3.2. 詳細

3.2.1. パッケージシステム

  • 待望の Backpack モジュールシステムを完全に使えるようにしました.詳細については the GHC Wiki を参照してください.

3.2.2. 言語

  • パターンシノニムシグネチャが,値レベルの束縛シグネチャと同様に,複数パターンに適用できるようになりました. 詳細については Typing of pattern synonyms を参照してください.
  • クラスインスタンスを自動導出するときに使う戦略を明示できるようになりました. これには言語拡張 -XDerivingStrategies を有効にします (Deriving strategies を参照してください).
  • 新たに言語拡張 -XUnboxedSums を使って,直和データのより効率のよい表現が使えるようになりました. 将来の GHC リリースにおいて,直和データ引数のワーカー/ラッパー変換および構成子アンパッキングがサポートされる予定です.
  • 新しく導入された HasField クラスと関連のコンパイラのロジック(Record field selector polymorphism を参照してください) により多重定義されたレコードフィールドがサポートされます.
  • GHC が COMPLETE プラグマを識別するようになりました. これによりユーザが(パターンシノニムを含む)パターン集合を指定して, パターン照合を完全なものにできるようになりました.詳細は COMPLETE pragmas を参照してください.

3.2.3. コンパイラ

  • GHC は可能であれば,システムのデフォルトリンカ ld ではなく ld.gold または ld.lld を使うようになりました.どのリンカが使えるかは configure のときに決まります. どのリンカを使うかはユーザが configureLD 変数を指定して渡すことで上書きできます. --disable-ld-override フラグを configure に渡せば,以前と同様システムのデフォルトリンカ ld を使うように戻せます.
  • GHC はリンカベースのデッドコード除去のデフォルト機構として,オブジェクト分割(すなわち -split-objs)ではなく, セクション分割(すなわち -split-sections)を用いるようになりました. 効果としては同じですが,セクション分割のほうが,オブジェクト分割よりも明らかに小さなオブジェクトを生成する傾向にあり, また他のコンパイラでのアプローチをより反映したものになっています. オブジェクト分割は非推奨となり,将来のGHCリリースでは取り除くことになりました.

    よく普及しているBFDリンカには,セクション分割を有効にすると, 大きなライブラリに関して性能に問題があるバージョンがあることに注意してください (Trac #13739 参照). もし,そういう問題に遭遇したら gold リンカか lld リンカを使うことをお勧めします. すなわち,どちらかのリンカをインストールし, configure スクリプトを再実行して,GHC を再インストールしてください.

    セクション分割がサポートされるようなプラットフォーム用のバイナリディストリビューションでは, デフォルトでセクション分割が有効になっています.

  • 古いプロファイリング用フラグ -auto-all-auto-caf-all は非推奨になり, これらのフラグを使うとコンパイル時に警告が出ます.
  • 宣言へのコストセンター追加をサポートするようにしました.従来の SCC の構文が使えます. また,コストセンター名を指定する形式が追加になっています.例は Inserting cost centres by hand を参照してください.
  • GHC は :-XDefaultSignatures に関して細かく制約するようになりました. 型クラスのデフォルトメソッドの型シグネチャは,当該型シグネチャの文脈における差異を除いては, 関連する主要メソッドの型シグネチャと同じでなければならなくなりました. この条件が満されない場合は,型検査器がクラスの定義を拒絶します. 詳細については Default method signatures を参照してください.
  • -XDeriveAnyClass は,引数のカインドが * あるいは * -> * でなければならないという 制限はなくなりました.
  • -XDeriveAnyClass がインスタンスのコンテキストを推論する方法をすっかり刷新しました. インスタンスコンテキストは派生クラスのメソッドの型シグネチャ(およびデフォルト型シグネチャ)を使って推論するようにしました. 以前はこの推論にはデータ型定義を使っており,制約の強すぎるインスタンスになったり, 型検査が通らなかったり(ひどい時には GHC がパニックになったり)します.詳細については DeriveAnyClass のセクションを参照してください.
  • GHCでは,データコンストラクタがスコープに含まれていなくても -XDeriveAnyClass を有効にすれば, スタンドアロンでの導出が可能になりました. すなわち -XDeriveAnyClass が指定されていれば, 以下のコード:

    deriving instance C T
    

    が,次のコード:

    instance C T
    

    と同一であり,後者のコードでは T のデータ構成子が有効範囲にあるかどうかという制約はないということです.

  • -XGeneralizedNewtypeDeriving は,メソッドを持たないクラスを派生させるとき,制約を推測しなくなります. すなわち

    class Throws e
    newtype Id a = MkId a
      deriving Throws
    

    というコードでは以下の

    instance Throws (Id a)
    

    というインスタンスが生成されるようになり

    instance Throws a => Throws (Id a)
    

    というインスタンスは生成しません. この変更は,後者のコードには冗長な Throws a という制約がかかっているために, -Wredundant-constraints フラグでコンパイルすると警告が出ることに対応したものです. 後者のインスタンスは,必要に応じて -XStandaloneDeriving を使うことで導出できます.

    deriving instance Throws a => Throws (Id a)
    
  • C のプリプロセッサに -Wundef を渡す警告フラグ -Wcpp-undef を追加しました. これは #if ディレクティブが未定義の識別子に使われていることを警告します.

  • GHC は高階ランク型シノニムのカインドを自動推論することはなくなりました. カインドシグネチャにより明示的に型シノニムに注釈を付けなければなりません. たとえば

    data T :: (forall k. k -> Type) -> Type
    

    という型があるとして, T の型シノニムを定義するには以下のように書かなければなりません.

    type TSyn = (T :: (forall k. k -> Type) -> Type)
    
  • GHC の Windows 版ツールチェーン mingw-w64 が更新されました. GHC は GCC 6.2.0 および binutils 2.27 を使います.
  • 以前は -Wmissing-methods が指定されていても,アンダースコアで始まる型クラスメソッドについては, インスタンス実装で定義されていなくても警告されませんでした. たとえば,以下のコードはなんの警告もなくコンパイルされました.

    class Foo a where
      _Bar :: a -> Int
    
    instance Foo Int
    

    今は -Wmissing-methods によって _BarFoo Int インスタンスで実装されていない旨の警告が出ます.

  • -ddump-json という新しいフラグを追加しました. このフラグはコンパイラの出力を JSON 文書としてダンプします. これは実験的なもので,次回リリースのツール作成者のフィードバックに応じて洗練されます.
  • GHC は,可能であれば既知のスーパークラスの辞書を使うことにより, 多相型の式の最適化をよりよく行えるようになりました.以下はその例です.

    -- ここで `Monad IO` あるいは `Applicative IO` を使えば改善になります.
    foo :: MonadBaseControl IO m => ...
    
    -- ここで `Monoid MyMonoid` を使えば改善になります.
    bar :: MonadWriter MyMonoid m => ...
    
  • GHC はデフォルト定義を使用するのではなく -XDeriveFunctor を使用するときに <$ の定義を導出するようになりました. これにより,再帰型に対する Functor を導出する差異に,不要なメモリ割り当てやスペースリークが防げます.
  • 言語拡張 -XExtendedDefaultRules はデフォルトでマルチパラメータの型クラスに対応するようになりました. Trac #12923 を参照してください.
  • GHC はデータ構成子に対する RULES を無視するようになりました(Trac #13290). 以前は,以下を受けつけていました.

    {-# RULES "NotAllowed" forall x. Just x = e #-}
    

    このルールはもう効力を失い,警告が出ます. 以下の RULES はデータ構成子に言及していますが,最も外側にはありません.

    {-# RULES "StillWorks" forall x. f (Just x) = e #-}
    
  • 型シノニムはインスタンスのクラス位置には現れなくなりました. すなわち,以下は許されなくなりました.

    type ReadShow a = (Read a, Show a)
    instance Read Foo
    instance Show Foo
    instance ReadShow Foo -- illegal
    

    Trac #13267 を参照してください.

  • 関連型族の正当性検査は多少強化されています. 以前は以下は受け入れられていました.

    class Foo a where
      type Bar a
    
    instance Foo (Either a b) where
      type Bar (Either c d) = d -> c
    

    これは Bar インスタンスで使用されている型変数がインスタンスヘッドの型変数と一致しないため,現在は許可されていません. このインスタンスは,以下のように変更すれば許可されます. :: it to:

    instance Foo (Either a b) where
      type Bar (Either a b) = b -> a
    

    詳細については associated type family instances の節を参照してください.

  • -XMonoLocalBinds-XPolyKinds の間の相互作用に関するバグが修正されました. この修正により,明示的に型シグネチャが与えられていない場合には,型検査に通らないプログラムがあります. 例については Kind generalisation を参照してください.

3.2.4. GHCi

  • カレントディレクトリにある .ghci-history を使うための -flocal-ghci-history フラグが追加されました.
  • 解釈済みのモジュールで -XStaticPointers が使えるようになりました. ただし static 式は REPL 内で評価する式の中には書けないことには変りはありません.

3.2.5. Template Haskell

  • 非ボックス化タプルを含む型の具体化機構が正しく動作するようになりました. (以前,Template Haskellは非ボックス化タプルをアリティ 2 のボックス化タプルとして具体化していました.)
  • シングルトン非ボックス化タプル(たとえば (# Int #) )のスプライシングが正しく機能するようになりました. 以前は Template Haskell はスプライシングの際に,だまって括弧を削除していましたので, (# Int #)Int に変換されていました.
  • パターン中の型シグネチャをサポートするようになりました.(Trac #12164)
  • クォートと具体化で同じ型を返すようになりました.(Trac #11629)
  • より多くのカインド注釈が具体化された閉じた型族等式の左辺にあらわれるようになりました. これは -XPolyKinds が有効になっているときに,曖昧になる型を曖昧でなくなるようにするためです. (Trac #12646)
  • クォートされた型シグネチャは暗黙に限量化された型変数についてより正確になりました. 以前は,以下のようにクォートすると,

    [d| id :: a -> a

    id x = x

    |]

    Template Haskell が戻すの実際には以下のようになります.

    id :: forall a. a -> a
    id x = x
    

    つまり,クォートすると元のソースでは暗黙であっても限量化が,すべての型変数について明示されるということです. これは,カインド変数が暗黙に限量化されている場合には特に有害です. たとえば,以下のようなクォート宣言をしたとしましょう.

    [d| idProxy :: forall proxy (b :: k). proxy b -> proxy b
        idProxy x = x
      |]
    

    これをスプライスすると,以下のうようになります.

    idProxy :: forall k proxy (b :: k). proxy b -> proxy b
    idProxy x = x
    

    ここで k は明示的に限量化されています.こうなると -XTypeInType が有効になっていなければなりません. しかし,元々の宣言ではそうはなっていませんでした.

    Template Haskell のクォートでは型シグネチャでの暗黙の限量化が尊重されるようになりました. したがって,上のクォートされた宣言では,型変数 a および k に対する限量化は暗黙のままになりす. (Trac #13018 および Trac #13123)

  • シンボル名 (たとえば +) をもつ型構成子の検索が期待どおり機能するようになりました (Trac #11046).

3.2.6. ランタイムシステム

  • ヒープオーバーフローが発生すると,捕捉可能な例外を投げるようになっています. ヒープオーバーフローは,GC中に RTS が +RTS -M (-M ⟨size⟩ 参照)で設定された限界を 超えたかで検出します.メモリ割り当てを OS に拒否されたかどうかで検出しているわけではありません. この例外は UserInterrupt 例外を受け取るのと同じスレッドに投げられますので,ユーザプログラムで捕捉できます.
  • コンパクトリージョン のサポートが追加されました.これは長寿命データを ヒープ外へ手動で移動する手段を提供するもので,ガーベッジコレクタが繰り返し追跡する必要がなくなります. コンパクト化されたデータは,同じプログラムで,シリアライズし,格納し,デシリアライズすることもできます. 詳細については :ghc-compact-ref:`GHC.Compact <GHC-Compact.html>` モジュールを参照してください. さらに,高水準のインターフェイスについては Hackage にある compact パッケージを参照してください.
  • NUMA(Non-Uniform Memory Architecture)を搭載したマシンでのパフォーマンスを改善するためのサポートが入りました. --numa を参照してください.これは,LinuxおよびWindowsシステムでサポートされます.
  • ガーベッジコレクタには -N ⟨x⟩ で設定した値よりも少ないスレッドを使うように指示できるようになりました. デフォルトでは,ガーベッジコレクタは指定された数か物理コア数の小さいほうの数のスレッドを使います. -qn ⟨x⟩ および ブログ記事 に解説があります.
  • heap profiler はヒープセンサスデータを GHC のイベントログに出力できるようになり, ヒーププロファイルを他のトレースイベントと関連付けられるようになりました(Trac #11094 参照).
  • プロファイラのスタックトレース実装でいくつかのバグが修正されました. このバグにより,間違ったスタックトレースや間違ったコストセンタースタックの値が示されることがありました (Trac #5654 参照).
  • Windows用のプロセッサーグループのサポートを追加しました. これにより,ランタイムは複数のプロセッサグループを持つシステムのすべてのコアにスレッドを割り当てることができます. (64を超えるコアなど Trac #11054 を参照してください.)
  • Event log の出力を設定して,外部ツールがアプリケーションの実行中に イベントログデータを収集分析できるようすることが可能になりました。
  • advapi32shell32user32 が GHCi に自動的にロードされるようになりました. libGCC も,依存関係で必要になったときにはロードされます. Trac #13189.

3.2.7. hsc2hs

  • バージョン 0.68.2

3.3. ライブラリ

3.3.1. array

  • バージョン 0.5.2.0 (従来 0.5.0.0)

3.3.2. base

完全なリリースノートについては base パッケージにある changelog.md を参照してください.

  • バージョン 4.10.0.0 (従来 4.9.0.0)
  • Data.Either モジュールは fromLeft および fromRight を提供するようになりました.
  • Data.Type.Coercion モジュールは gcoerceWith を提供するようになりました. これは Data.Type.EqualitygcastWith に類似した機能を提供します.
  • Data.Functor.Classes にある Read1 および Read2 クラスには ReadS ではなく ReadPrec を使って定義した liftReadList および liftReadListPrec というメソッドが追加されています. これは GHC 版の Read クラスが提供するインターフェイスに一致するので, ユーザが Read1Read2 のインスタンスを効率良く定義できるようになっています.
  • type family AppendSymbol (m :: Symbol) (n :: Symbol) :: SymbolGHC.TypeLits に追加されました.
  • Natural-ベースの KnownNat を含む GHC.TypeNats を追加しました. GHC.TypeLitsNat 演算はその上に互換性レイヤを被せたものです. 注意: KnownNat というエビデンスは Integer から Natural に変更されています.
  • liftA2Applicative クラスのメソッドになりました. Traversable の導出は,各構成子の最初の2要素のトラバースに liftA2 を使うように変更されました. 現時点では liftA2Prelude にはありませんので Control.Applicative から インポートする必要があります.将来は Prelude に入るでしょう.

3.3.3. binary

  • バージョン 0.8.5.1 (従来 0.7.1.0)

3.3.4. bytestring

  • バージョン 0.10.8.2 (従来 0.10.4.0)

3.3.5. Cabal

  • バージョン 2.0.0.0 (従来 1.24.2.0)

3.3.6. containers

  • バージョン 0.5.10.2 (従来 0.5.4.0)

3.3.7. deepseq

  • バージョン 1.4.3.0 (従来 1.3.0.2)

3.3.8. directory

  • バージョン 1.3.0.2 (従来 1.2.0.2)

3.3.9. filepath

  • バージョン 1.4.1.2 (従来 1.3.0.2)

3.3.10. ghc

  • バージョン 8.2.1

3.3.11. ghc-boot

  • これは内部パッケージです.慎重に使ってください.

3.3.12. ghc-compact

ghc-compact パッケージは,不変のデータ構造をメモリの連続領域に配置するための実験的な API を提供します. このような領域に配置されたデータはガーベッジコレクション中に追跡されることはなく,ディスクまたはネットワーク上にシリアライズできます.

  • バージョン 0.1.0.0 (新規追加)

3.3.13. ghc-prim

  • バージョン 0.5.1.0 (従来 0.3.1.0)
  • 新しく isByteArrayPinned# 演算と isMutableByteArrayPinned# 演算が追加されました.
  • GHC.Magic モジュールの新しい関数 noinline を使って,関数にインライン展開してはいけない というマークを付けられます.このマークはシンプリファイア実行後の最適化により除去されます.

3.3.14. hoopl

  • バージョン 3.10.2.2 (従来 3.10.2.1)

3.3.15. hpc

  • バージョン 0.6.0.3 (従来 0.6.0.2)

3.3.16. integer-gmp

  • バージョン 1.0.1.0 (従来 1.0.0.1)

3.3.17. process

  • バージョン 1.6.1.0 (従来 1.4.3.0)

3.3.18. template-haskell

  • バージョン 2.12.0.0 (従来 2.11.1.0)
  • 非ボックス化直和がサポートされました. Trac #12478.
  • 型変数適用がサポートされました. Trac #12530.

3.3.19. time

  • バージョン 1.8.0.1 (従来 1.6.0.1)

3.3.20. unix

  • バージョン 2.7.2.2 (従来 2.7.2.1)

3.3.21. Win32

  • バージョン 2.5.4.1 (従来 2.3.1.1)

3.4. 既知のバグ

  • 8.0 系にくらべてコンパイル時間がずっとかかるプログラムが少くとも1つあります. Trac #13535 を参照してください.
  • GHC がパニックを起すような型適用の使用例があります. Trac #13819 を参照してください.
  • -XUndecidableInstances を使うモジュールで,コンパイラが型検査の際にループしてしまう場合があります. Trac #13943 を参照してください.