OCaml4.04.0の変更点

last mod. 2016-11-13 (日) 14:09:02

http://caml.inria.fr/pub/distrib/ocaml-4.04/notes/Changes を元にしています。

既存のプログラムを壊す可能性のある変更点には * をつけてある。

個々の変更点の解説については 4.04.0 changes explanation · gasche/ocaml-releases-change-explanation Wiki も参照(英語)。

言語機能

  • PR#7233: 非局所的な抽象型に対する GADT の等式をサポート
    (Jacques Garrigue)
  • GPR#187, GPR#578: モジュールの局所 open をパターンでも可能に。構文は以下の通り M.(p), M.[p], M.[|p|], M.{p}
    (Florian Angeletti, Jacques Garrigue, review by Alain Frisch)
  • GPR#301: 局所例外定義 let exception ... in
    (Alain Frisch)
  • GPR#508: セミコロンに拡張ノードを付ける短縮構文 ;%foo
    (Jeremie Dimino)
  • GPR#606: 単一のフィールドから成る変更不能なレコードや、単一構成子・単一引数の具象型の表現を最適化。この最適化は型定義に [@@unboxed] 属性を付けることで有効になる。現在は、相互再帰的なデータ型ではうまく働かないことがある。この制限は将来取り除かれるはずである。 MPR#7364 も参照
    (Damien Doligez)

コンパイラのユーザーインタフェースと警告

  • * PR#6475, GPR#464: コマンドラインオプションをファイルをコンパイルする前に解釈するように。これにより、複数回 -o を指定した場合や -c と -o を組み合わせた場合の意味が変化して(改良されて)いる。詳しくは https://github.com/ocaml/ocaml/commit/da56cf6dfdc13c09905c2e07f1d4849c8346eec8 のコミットメッセージを参照
    (whitequark)
  • PR#7139: 警告38(未使用の例外構成子及び開いたデータ型の構成子)の表現をわかりやすく
    (Gabriel Scherer)
  • * PR#7147, GPR#475: ppx rewriter のエラー表示に色を付ける
    (Simon Cruanes, Jérémie Dimino)
  • PR#7169, GPR#501: 警告8(網羅的でないパターンマッチ)の表現をわかりやすく
    (Florian Angeletti, review and report by Gabriel Scherer)
  • * GPR#591: OCAMLPARAM まわりの改良
    (Marc Lasson, review by Damien Doligez and Alain Frisch)
    1. -a, -pack, -shared 時は指定されたオブジェクトファイルを無視する
    2. トップレベルではパラメータをオブジェクトファイルの後ではなく前に挿入する
    3. トップレベルで -I dirs を解釈する
    4. スレッド使用時に -I dirs が無視されていたバグを修正
  • GPR#648: コンパイラを実行時に動的に拡張するための -plugin オプションを ocamlc と ocamlopt に追加
    (Fabrice Le Fessant)
  • GPR#684: 未使用のモジュール宣言を検出する
    (Alain Frisch)
  • GPR#706: cmiを読み込むための関数への ref である Env.Persistent_signature.load を追加。この値はファイル以外からcmiを読み込むような関数にも変更できる。これにより、例えば、 self-contained なトップレベルを作ることができる
    (Jérémie Dimino)

標準ライブラリ

  • GPR#473: `Sys.backend_type` を提供。ユーザーがバックエンド依存(例えばコード生成器)のコードを書けるように
    (Hongbo Zhang)
  • PR#6279, GPR#553: Set.map を実装
    (Gabriel Scherer)
  • PR#6820, GPR#560: ある値の「推移的な」ヒープサイズを計算する Obj.reachable_words を追加
    (Alain Frisch, review by Mark Shinwell and Damien Doligez)
  • GPR#589: マイナー領域に割り当てられたワードサイズを計算する関数を追加(この関数自体は領域を割り当てない)
    (Pierre Chambart, review by Damien Doligez and Gabriel Scherer)
  • GPR#626: String.split_on_char
    (Alain Frisch)
  • GPR#669: Filename.extension と Filename.remove_extension
    (Alain Frisch, request by Edgar Aroutiounian, review by Daniel Bunzli and Damien Doligez)
  • GPR#674: Filename: Sys.os_type が未知の値でも落ちないように。未知の値の場合は "Unix" であるかのように振る舞う(以前は Sys.os_type の値が "Unix", "Win32", "Cygwin" 以外の場合は Filename モジュールの初期に失敗していた。例えば mirage-os では Sys.os_type の値は "xen" である)
    (Anil Madhavapeddy)

コード生成と最適化

  • PR#4747, GPR#328: 内部のバケットリストを破壊的に書き換えることで Hashtbl を最適化。すべての操作は固定のスタック領域で実行されるようになり、通常の場合、より高速に動作するようになった。ただし、 Hashtbl.copy はかなり低速になる場合がある
    (Alain Frisch)
  • PR#6217, GPR#538: レコードの更新を最適化。 { foo with t1 = ..; t2 = ...; ... } で6個以上のフィールドを更新してもパフォーマンスが顕著に悪化することはない
    (Olivier Nicole, review by Thomas Braibant and Pierre Chambart)
  • PR#7023, GPR#336: unbox 戦略の改良
    (Alain Frisch, Pierre Chambart)
  • PR#7244, GPR#840: ocamlopt + flambda で巨大な配列リテラルをコンパイルするときに莫大なメモリが必要になる
    (Pierre Chambart, review by Mark Shinwell)
  • PR#7291, GPR#780: 異なる引数で再帰呼び出しする関数の特殊化。 4.03.0 では invariant 解析の間違いでコンパイルに失敗することがあった
    (Pierre Chambart, Mark Shinwell, report by Simon Cruanes)
  • GPR#427: Obj.is_block を C で書かれた external ではなく、 OCaml で書かれたインライン関数に。高速化されるはず
    (Demi Obenour)
  • GPR#580: 変更不能な浮動小数点数レコードを最適化
    (Pierre Chambart, review by Mark Shinwell)
  • GPR#602: モジュールリンク用のダミーコードを生成しないように
    (Pierre Chambart, reviewed by Jacques Garrigue)
  • PR#7328, GPR#702: flambda: ボックス化された int のゼロ除算を最適化で削除しないように。ゼロ除算のチェックを1回で済ませるように
    (Pierre Chambart, report by Jeremy Yallop)
  • GPR#703: configure 時に -safe-string を指定した場合は、一部の文字列定数への操作をコンパイル時に最適化するように
    (Pierre Chambart)
  • GPR#707: meet を計算するときにモジュール間情報を読み込む
    (Pierre Chambart, report by Leo White, review by Mark Shinwell)
  • GPR#709: 同一の分岐先コードを共有するように
    (Pierre Chambart, review by Gabriel Scherer)
  • GPR#712: array と lazy を型に基いて最適化
    (Alain Frisch, review by Pierre Chambart)
  • GPR#714: 警告59が定数の Lazy に対して発動しないように
    (Pierre Chambart, review by Leo White)
  • GPR#723 生成されるコードで関数の順序をもとのソースコードの出現順に合わせる
    (Pierre Chambart, review by Mark Shinwell)
  • 型の正規化不足により lazy x のコンパイルが複雑化していた
    (Alain Frisch)

実行時システム

  • PR#7210, GPR#562: ある値が到達不能になった場合に呼ばれるファイナライザ関数を登録できるように。既存のものと異なり、このファイナライザ関数は到達不能になった値を引数として取らない。ファイナライザ関数は GC.finalise_last で登録することができる
    (François Bobot reviewed by Damien Doligez and Leo White)
  • GPR#590: 事前の想定よりも実際のオーバーヘッドが小さければコンパクションをしない
    (Thomas Braibant)
  • PR#7203, GPR#534: float array を確保するための新たなプリミティブ caml_alloc_float_array
    (Thomas Braibant)

ツール

  • PR#7189: トップレベルの #show がモジュールエイリアスの連鎖を追うように
    (Gabriel Scherer, report by Daniel Bünzli, review by Thomas Refis)
  • PR#7248: ocamldep が -open オプションを左から右に解釈するように
    (Gabriel Scherer, report by Anton Bachin)
  • PR#7272, GPR#798: ocamldoc: type_*.html に <br /> が足りない
    (Florian Angeletti)
  • PR#7290: ocamldoc: インラインレコードまわりを改良
    (Florian Angeletti)
  • PR#7323, GPR#750: ocamllex ml が -safe-string で動作するように
    (Hongbo Zhang)
  • PR#7350, GPR#806: ocamldoc: 生成された HTML に viewport 指定を追加
    (Florian Angeletti, request by Daniel Bünzli)
  • GPR#452: ocamldep の出力が引数の与え方や実行環境によらず一定になるように
    (Alain Frisch)
  • GPR#548: 空のドキュメンテーションコメント
    (Florian Angeletti)
  • GPR#575: トップレベルに -no-version オプションを追加
    (Sébastien Hinderer)
  • GPR#598: ocamlyacc に --strict オプションを追加。構文規則の衝突をエラーとして扱うように(このオプションは OCaml コンパイラのパーサーでも使われている)
    (Jeremy Yallop)
  • GPR#613: ocamldoc が -open オプションを使うように
    (Florian Angeletti)
  • GPR#718: ocamldoc: 拡張可能なバリアントの構成子の順番を修正
    (Florian Angeletti)

デバッグとプロファイリング

  • GPR#585: 新たなメモリプロファイラ Spacetime
    (Mark Shinwell, Leo White)

マニュアルとドキュメント

  • PR#7007, PR#7311: OCAMLPARAM と ocaml_compiler_internal_params の存在をドキュメント化
    (Damien Doligez, reports by Wim Lewis and Gabriel Scherer)
  • PR#7243: ソースアーカイブを展開するときに WinZip? を使わないようにユーザーに警告
    (Damien Doligez, report by Shayne Fletcher)
  • PR#7245, GPR#565: 警告52 (脆弱な定数パターン)のメッセージとドキュメントをわかりやすく
    (Gabriel Scherer, William, Adrien Nader, Jacques Garrigue)
  • #PR7265, GPR#769: ファイル記述子が通常ファイルをラップしていないときの Unix.fstat の挙動を 4.02.3 のときのものに戻す(win32unix のみ)
    (Andreas Hauptmann, review by David Allsopp)
  • PR#7288: List.flatten: 誤解を招くドキュメントを修正
    (Damien Doligez, report by user 'tormen')
  • PR#7355: Gc.finalise と lazy な値について
    (Jeremy Yallop)
  • GPR#841: CAMLlocalN を使って宣言した配列に値を設定する場合は Store_field を使わないようドキュメント化
    (Mark Shinwell)

ビルドシステム

  • GPR#324: コンパイラ開発者向け: 標準ランタイムに新たにプリミティブを追加しても make bootstrap する必要がないように
    (François Bobot)
  • GPR#384: 古い Microsoft 製コンパイラ(セキュリティ強化版のCRT関数をサポートしない SDK Visual Studio 2005 compiler 以前のものと、 64ビット整数リテラルをサポートしないVisual Studio .NET 2002以前のもの)でのコンパイルを修正
    (David Allsopp)
  • GPR#507: Unix と Windows で Makefile の共有部分を増やす
    (whitequark, review by Alain Frisch)
  • * GPR#512, GPR#587: ネイティブ版をビルドした場合は、それらを ocamlc, ocamlopt, ocamllex としてインストールする
    (Demi Obenour)
  • GPR#687: ./configure に -safe-string オプションを渡すことで、ビルドされた処理系に -unsafe-string オプションを渡せないようにする。これにより、より強い形で文字列の不変性を保証することができる
    (Alain Frisch, review by Hezekiah M. Carty)

バグ修正

  • * PR#6505: 型エラーの見逃しにより、レコードアクセスで segfault していた
    (Jacques Garrigue, extra report by Stephen Dolan)
    この修正のためには、再帰型に対してより強い制限を設ける必要があった。再帰の整礎性を調べるとき、相互再帰型は抽象型(すなわち contractive でない)として扱う
  • * PR#6752: 名前的な型とスコープの逸出。一般化されない型変数を strict scope に戻した。 Mantis を参照。これは 4.03 よりも制限が強いことに注意。 例えば PR#7313 を参照。一般化されない型変数をインスタンス化するのに、型アノテーションを明示する必要がある場合がある
    (Jacques Garrigue, following discussion with Jeremy Yallop, Nicolas Ojeda Bar and Alain Frisch)
  • PR#7112: ファンクタ引数において、モジュールの別名がモジュール型の等価性判定で無視される
    (Jacques Garrigue, report by Leo White)
  • PR#7134: コンパイラが型エラー報告時に不要な cmi を読み込もうとして別のエラーを報告する
    (Jacques Garrigue, report and suggestion by sliquister)
  • PR#7153: Unix.SOCK_SEQPACKET が利用可能な環境は少ないことをドキュメント化
  • PR#7165, GPR#494: 不正な lexer 指示子により捕捉されない例外が発生する
    (Gabriel Scherer, report by KC Sivaramakrishnan using afl-fuzz)
  • PR#7257, GPR#583: 4.03 で Unix.sleep 0. の挙動が変化していたのを 4.03 より前と同じように、 (nano)sleep を 0 を引数として呼び出すように戻す
    (Hannes Mehnert, review by Damien Doligez)
  • PR#7260: GADT と部分型付けを組み合わせるとコンパイル時に落ちる
    (Jacques Garrigue, report by Nicolas Ojeda Bar)
  • PR#7269: GADT 内で多相バリアントの & 制約を使うと segfault する
    (Jacques Garrigue, report by Stephen Dolan)
  • PR#7276: Windowsビルドのselectで FD_SETSIZE の値よりも多い個数のソケットをサポートする
    (David Scott, review by Alain Frisch)
  • * PR#7278: private なインラインレコードが書き換えられないようにする
    (Alain Frisch, report by Pierre Chambart)
  • PR#7284: mcomp_fields のバグで落ちる
    (Jacques Garrigue, report by Leo White)
  • PR#7285: -principal 指定時のrelaxed値制約がこわれている
    (Jacques Garrigue, report by Leo White)
  • PR#7297: -strict-sequence で警告21が無効になる
    (Jacques Garrigue, report by Valentin Gatien-Baron)
  • PR#7299: win32unix でブロッキングセクション内で OCaml のヒープにさわらないようにする
    (David Allsopp, report by Andreas Hauptmann)
  • PR#7300: Windows ビルドの Unix.sleep でブロッキングセクション内で OCaml のヒープにさわらないようにする
    (David Allsopp)
  • PR#7305: -principal を指定すると、コンパイル中に型検査がループする
    (Jacques Garrigue, report by Anil Madhavapeddy, analysis by Leo White)
  • PR#7330: 拡張可能なバリアントの網羅性が検査されない
    (Jacques Garrigue, report by Elarnon *)
  • PR#7374: 型制約が無視されることにより contractiveness の検査が健全でなくなる
    (Jacques Garrigue, report by Leo White)
  • PR#7378: GADTの構成子が互換性のない型で再公開できてしまう
    (Jacques Garrigue, report by Alain Frisch)
  • PR#7389: Unsoundness in GADT exhaustiveness with existential variables
    (Jacques Garrigue, report by Stephen Dolan)
  • * GPR#533: Thread.wait_signal: sigwait の返したシグナル番号を OS 非依存の数値に変換するようにする
    (Jérémie Dimino)
  • GPR#600: (GPR#555と類似) register typing constraints で制御フローグラフの n-way join point を考慮に入れる
    (Mark Shinwell)
  • GPR#672: float_of_hex のパーサーで、不正な入力が正しくエラーになるように
    (Bogdan Tătăroiu, review by Thomas Braibant and Alain Frisch)
  • GPR#700: maximum weak bucket size を修正
    (Nicolas Ojeda Bar, review by François Bobot)
  • GPR#708 strengthening 中により多くの場所でモジュールの別名が認められるように
    (Leo White)
  • GPR#713, PR#7301: flambdaで lazy まわりのコード生成が誤っていたのを修正
    (Mark Shinwell, review by Pierre Chambart and Alain Frisch)
  • GPR#721: flambda: [@@specialize] アノテーションで無限ループするのを修正
  • GPR#779: Windows 上でネイティブランタイムをビルドするとき、システムレベルで flexlink がインストールされていると FlexDLL のブートストラップに失敗する
    (David Allsopp, report Michael Soegtrop)
  • GPR#805, GPR#815, GPR#833: String.concat で int のオーバーフローを検査する
    (Jeremy Yallop, review by Damien Doligez, Alain Frisch, Daniel Bünzli, Fabrice Le Fessant)
  • GPR#810: Array.concat で int のオーバーフローを検査する
    (Jeremy Yallop)
  • GPR#814: Buffer.add_substring の境界チェックで int のオーバーフローを考慮する
    (Jeremy Yallop)
  • GPR#880: flambda: デフォルトパラメータと [@@inline] を組み合わせたときの挙動を修正
    (Leo White)
  • GPR#525: OpenIndiana? 上でのビルドを修正
    (Sergey Avseyev, review by Damien Doligez)

compiler-libs 及び内部的な変更

  • PR#7200, GPR#539: parsing/pprintast.ml の改修、バグ修正、テスト追加
    (Runhang Li, David Sheets, Alain Frisch)
  • GPR#351: driver/pparse.ml の関数を型安全に
    (Gabriel Scherer, Dmitrii Kosarev, review by Jérémie Dimino)
  • GPR#516: Texp_record 構成子を変更して record update の型情報を伝播させるように
    (Pierre Chambart, review by Alain Frisch)
  • GPR#678: Graphics.close_graph が 64-bit Windows 版でクラッシュしていた(PR#3963 の再実装)
    (David Allsopp)
  • GPR#679: docstring の登録を mapper 適用後まで遅延する
    (Hugo Heuzard, review by Leo White)
  • GPR#872: (**/**) コメントはノードに付加しない
    (Thomas Refis, review by Leo White)

新規 編集 添付