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のときに決まります. どのリンカを使うかはユーザがconfigureにLD変数を指定して渡すことで上書きできます.--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は、関連付けられた型族を持つ型クラスを派生させるようになりました。 GeneralizedNewtypeDeriving and associated type families を参照してください.
-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によって_BarがFoo 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 内で評価する式の中には書けないことには変りはありません.
:type +dおよび:type +vが使えるようになりました(Trac #11975 を参照してください).
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 の出力を設定して,外部ツールがアプリケーションの実行中に イベントログデータを収集分析できるようすることが可能になりました。
advapi32,shell32,user32が 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.EqualityのgcastWithに類似した機能を提供します.
Data.Functor.ClassesにあるRead1およびRead2クラスにはReadSではなくReadPrecを使って定義したliftReadListおよびliftReadListPrecというメソッドが追加されています. これは GHC 版のReadクラスが提供するインターフェイスに一致するので, ユーザがRead1やRead2のインスタンスを効率良く定義できるようになっています.
type family AppendSymbol (m :: Symbol) (n :: Symbol) :: SymbolがGHC.TypeLitsに追加されました.
Natural-ベースのKnownNatを含むGHC.TypeNatsを追加しました.GHC.TypeLitsのNat演算はその上に互換性レイヤを被せたものです. 注意:KnownNatというエビデンスはIntegerからNaturalに変更されています.
liftA2はApplicativeクラスのメソッドになりました.Traversableの導出は,各構成子の最初の2要素のトラバースにliftA2を使うように変更されました. 現時点ではliftA2はPreludeにはありませんので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 を参照してください.