OCaml4.05.0の変更点
このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
last mod. 2017-07-22 (土) 17:47:09
http://caml.inria.fr/pub/distrib/ocaml-4.05/notes/Changes を元にしています。
変更点のさらに詳細な説明は 4.05.0 changes explanation · gasche/ocaml-releases-change-explanation Wiki なども参照。
既存のプログラムを壊す可能性のある変更点には * をつけてある。
言語機能
コード生成と最適化
- MPR#7201, GPR#954: 0 / <expr> や 0 mod <expr> で、 <expr> が0に評価される非定数式の場合の最適化が誤っていたのを修正
(Mark Shinwell, review by Gabriel Scherer, Leo White and Xavier Leroy)
- MPR#7357, GPR#832: トップレベルの include (struct ... end : sig ... end) のコンパイル時間を改善
(Alain Frisch, report by Hongbo Zhang, review by Jacques Garrigue)
- MPR#7533, GPR#1173: / と mod で特定の場合の副作用が正しく起こるように
(Mark Shinwell, report by Jan Mitgaard)
- GPR#504: afl-fuzzを使ったファジングのためのinsrumentation
(Stephen Dolan, review by Alain Frisch, Pierre Chambart, Mark Shinwell, Gabriel Scherer and Damien Doligez)
- GPR#863, GPR#1068, GPR#1069: 定数とのパターンマッチングをテーブルルックアップに
(Stephen Dolan, review by Gabriel Scherer, Pierre Chambart, Mark Shinwell, and bug report by Gabriel Scherer)
- GPR#1150: arm64アセンブラ指示子のtypoを修正
(KC Sivaramakrishnan)
実行時システム
- MPR#7423, GPR#946: `void caml_{failwith,invalid_argument}(char const *msg)` に加えて、例外を送出する関数 `void caml_{failwith,invalid_argument}_value(value msg)` を追加。以前からある関数はメッセージ引数を開放しないため、メッセージを動的に割り当てる場合に不便だった。新たに追加された関数ではメッセージ引数はGCで処理される
(Gabriel Scherer, review by Mark Shinwell, request by Immanuel Litzroth)
- MPR#7557, GPR#1213: よりセキュアなgetenv
(Damien Doligez, reports by Seth Arnold and Eric Milliken, review by Xavier Leroy, David Allsopp, Stephen Dolan, Hannes Mehnert)
- GPR#795: Sys.executable_nameの256文字制限を撤廃
(Xavier Leroy)
- GPR#891: ランタイムをgccでビルドする場合は-fno-builtin-memcmpフラグを使う
(Leo White)
型システム
- MPR#6608, GPR#901: レコード型のすべてのフィールドを with で変更した場合、 with の左側の値と結果のレコード型を単一化するように
(Tadeu Zagallo and Gabriel Scherer, report by Jeremy Yallop, review by David Allsopp, Jacques Garrigue)
- * MPR#7414, GPR#929: 汎化されない型変数とファンクタを組み合わせたときの健全性バグ
(Jacques Garrigue, report by Leo White)
コンパイラのユーザーインタフェースと警告
- MPR#7050, GPR#748 GPR#843 GPR#864: 追加のコマンドライン引数をファイルから与える -args/-args0 <file> オプションを追加。詳しくはドキュメントを参照。ユーザーは Arg モジュールの Expand 構成子を使えば同様のオプションを実装することができる
(Bernhard Schommer, review by Jérémie Dimino, Gabriel Scherer and Damien Doligez, discussion with Alain Frisch and Xavier Leroy, feature request from the Coq team)
- MPR#7137, GPR#960: -open コマンドラインオプションが(モジュール名ではなく)モジュールパスを受け取るように
(Arseniy Alekseyev and Leo White)
- MPR#7172, GPR#970: ocamlc -config が int_size, word_size, ext_ext を表示するように
(Gabriel Scherer, request by Daniel Bünzli)
- MPR#7315, GPR#736: 一部のエラー箇所表示をより細かく
(Gabriel Scherer and Alain Frisch, report by Matej Košík)
- MPR#7473, GPR#1025: Windows 上でのコマンドライン引数のグロブ展開を修正
(Jonathan Protzenko)
- MPR#7479: ocamlc -pack の引数が .cmo と .cmi のみであること、 ocamlopt -pack の引数が .cmx と .cmi のみであることを確認する
(Xavier Leroy)
- GPR#796: コンパイラプラグインがコマンドライン引数を追加することを許す
(Fabrice Le Fessant)
- GPR#829: ファンクタに対する別名を open したときのエラーメッセージをわかりやすく
(Alain Frisch)
- GPR#911: ocamlc/ocamlopt をサードパーティのCソースファイルをコンパイルするときに呼び出した場合、Cコンパイラに警告関連のオプションを渡さないように
(Sébastien Hinderer, review by Adrien Nader and David Allsopp)
- GPR#915: -dsource (pprintast.ml) のバグを修正
(Runhang Li, review by Alain Frisch)
- * GPR#933: gprof によるプロファイリングをサポートしない環境では ocamlopt -p がエラーを報告するように。このような環境ではダミーのプロファイリングライブラリはインストールされなくなった。プロファイリングがサポートされているかどうかは ocamlopt -config で確認できる
(Sébastien Hinderer)
- GPR#1009: ocamlc -c -linkall や ocamlopt -c -linkall を使って個々の翻訳単位ごとに「常にリンクする」フラグを設定できるようになった。この方法を使うと -a -linkall よりもより細かい粒度でリンクの挙動を制御できる。 -a -linkall では与えられたライブラリのすべての翻訳単位に対してフラグを設定していた
(Xavier Leroy)
- GPR#1015: ocamldep にも -plugin PLUGIN オプションを追加。 ocamldep をビルドするのに compiler-libs 使う
(Fabrice Le Fessant)
- GPR#1027: -dtimingsの様々な改善。特に、プリプロセッサのようなサブプロセスでかかった時間も含むように
(Valentin Gatien-Baron, review by Gabriel Scherer)
- GPR#1098: -color 引数が指定されていない場合、コンパイラが環境変数 OCAML_COLOR を考慮するようになった。これにより、ユーザーは ocaml の呼び出し部分を変更せずにデフォルトの振る舞いから変更できるようになった
(Hannes Mehnert, Guillaume Bury, review by Daniel Bünzli, Gabriel Scherer, Damien Doligez)
標準ライブラリ
- MPR#6975, GPR#902: Buffer.truncateを追加
(Dhruv Makwana, review by Alain Frisch and Gabriel Scherer)
- MPR#7279, GPR#710: `Weak.get_copy` `Ephemeron.*_copy` がcustom lbockをコピーしないように
(François Bobot, Alain Frisch, bug reported by Martin R. Neuhäußer, review by Thomas Braibant and Damien Doligez)
- * MPR#7500, GPR#1081: Uchar.dumpを削除
(Daniel Bünzli)
- GPR#760: リスト全体の長さを計算しない List.compare_length と List.compare_length_with を追加
(Fabrice Le Fessant, review by Leo White, Josh Berdine and Gabriel Scherer)
- GPR#778: Arg: 単一の引数文字列を文字列配列引数に展開できる Expand オプションを追加
(Bernhard Schommer, review by Gabriel Scherer and Jérémie Dimino)
- GPR#849: Spacetime.enabled を公開
(Leo White)
- GPR#885: 標準ライブラリの関数群に option を返す変種を追加
(Alain Frisch, review by David Allsopp and Bart Jacobs)
- GPR#869: Map, Setにfind_first, find_first_opt, find_last find_last_optを追加。比較述語を満足する最初/最後の束縛/要素を返す
(Gabriel de Perthuis, with contributions from Alain Frisch, review by Hezekiah M. Carty and Simon Cruanes, initial report by Gerd Stolpmann)
- GPR#875: ArrayLabels, ByteLabels?, ListLabels?, MoreLabels?, StringLabels に 〜Labels なしのモジュールのみに存在していた関数を追加。さらに、 StringLabels, ByteLabels? にラベルなしモジュールで指定されていた @@ocaml.deprecated 属性を追加
(Roma Sokolov, review by Gabriel Scherer, Jacques Garrigue, Gabriel Radanne, Alain Frisch)
- GPR#999: Arg: エラー報告時にusageを3回表示しないように(4.03のレグレッション)
(Florian Angeletti, review by Gabriel Scherer)
- GPR#1042: Windows上での Unix.create_process{,_env} のコマンドライン引数のエスケープを修正。タブを含む引数が子プロセスにそのまま渡るように
(Nicolas Ojeda Bar, Andreas Hauptmann review by Xavier Leroy)
デバッグとプロファイリング
- MPR#7258: ocamldebug の install_printer にはモジュールの別名まわりで問題があった
(Xavier Leroy)
- GPR#378: 指定されたバックトレースで例外を送出する Printexc.raise_with_backtrace を追加
(François Bobot, review by Gabriel Scherer, Xavier Leroy, Damien Doligez, Frédéric Bour)
マニュアルとドキュメント
- MPR#6597, GPR#1030: 構文の非終端記号を拡張するような言語拡張への参照を前の節に追加
(Florian Angeletti, review by Gabriel Scherer)
- MPR#7497, GPR#1095: マニュアルの目次に節番号を付ける
(Florian Angeletti, request by Daniel Bünzli)
- MPR#7539, GPR#1181: マニュアルのocamldocの章のリンク切れを更新
(Florian Angeletti)
- GPR#633: manページとマニュアルに -opaque オプションのドキュメントを追加
(Konstantin Romanov, Gabriel Scherer, review by Mark Shinwell)
- GPR#751, GPR#925: リポジトリ内でhackする人向けのあれこれを詰め込んだ HACKING.adoc を追加。上流にコントリビュートする場合の方法については CONTRIBUTING.md を参照
(Gabriel Scherer and Gabriel Radanne, review by David Allsopp, inspired by John Whitington)
- GPR#916: 新しいツール lintapidiff を追加。これを使って 4.00-4.05 で導入されたAPIの変更に @since アノテーションが付けられた
(Edwin Török, review by Gabriel Scherer, discussion with Alain Frisch, David Allsopp, Sébastien Hinderer, Damien Doligez and Xavier Leroy)
- GPR#939: マニュアルの言語拡張の節で caml_example 環境を使うようにして、既存のコード例もいくつかこの形式に変更
(Florian Angeletti)
- GPR#1082: quoted stringsを前処理するには、さらに [%foo ...] 拡張ノードで非標準的な解釈を加える必要もあることを明確化
(Gabriel Scherer, request by Matthew Wahab in GPR#1066, review by Florian Angeletti)
その他のライブラリ
- MPR#7158: Event.sync, Mutex.create, Condition.create がGCを起こし過ぎていた。この修正で condition variableは貴重なカーネル資源であるとは考えないようになった
(Xavier Leroy)
- MPR#7264: POSIXとWin32での Unix.lockf の振る舞いの違いについてドキュメント化
(Xavier Leroy, report by David Allsopp)
- MPR#7339, GPR#787: 「0次元」のbigarrayをサポート(Bigarrayのドキュメントを参照)
(Laurent Mazare, review by Gabriel Scherer, Alain Frisch and Hezekiah M. Carty)
- * MPR#7342, GPR#797: Windows上ではパイプにデータが残っていない場合 Unix.read がEPIPEエラーになっていたが、他のOSと同様に0を返すように変更
(Jonathan Protzenko, review by Andreas Hauptmann and Damien Doligez)
- GPR#650: Unixライブラリのファイル記述子を作成する関数 (`dup`, `dup2`, `pipe`, `socket`, `socketpair`, `accept`) に省略可能な `?cloexec:bool` 引数を追加。この引数の実装は、そのOSでファイル記述子を作成するときに同時に close-on-exec-flag を設定(またはクリア)するような最大限アトミックな方法で実装されており、他のスレッドで exec や create_process を呼んだ場合の競合状態のリスクを低減するようになっている。さらに、 openfile に O_CLOEXEC との対称性のため、 O_KEEPEXEC フラグを追加
(Xavier Leroy, review by Mark Shinwell, David Allsopp and Alain Frisch, request by Romain Beauxis)
- GPR#996: systhreads で正しく caml_top_of_stack を更新する
(Fabrice Le Fessant)
トップレベル
- MPR#7060, GPR#1035: install_printerで設定した表示関数内で発生した例外を表示する
(Tadeu Zagallo, review by David Allsopp)
ツール
- MPR#5163: ocamlobjinfo: 定義済みのグローバル変数をダンプする
(Stéphane Glondu)
- MPR#7333: ocamldoc: 与えられたテキストファイルの最初の一文をモジュールの概要文として使う
(Florian Angeletti)
- GPR#848: ocamldoc: HTML出力のリンクターゲットをエスケープする
(Etienne Millon, review by Gabriel Scherer, Florian Angeletti and Daniel Bünzli)
- GPR#986: ocamldoc: エラーメッセージ中のパスを相対パスで表示する。これにより、 ocamlbuild と組み合わせたときの問題 ocaml/ocamlbuild#79 が解決している
(Gabriel Scherer, review by Florian Angeletti, discussion with Daniel Bünzli)
- GPR#1017: ocamldoc: コード断片内が既知の要素へのリンクに置き換え可能な場合を検出するオプションを追加
(Florian Angeletti, review and suggestion by David Allsopp)
- ocamldoc: パースエラーのメッセージをわかりやすく
(Gabriel Scherer)
コンパイラ自体のビルド
- MPR#7377: 新しめのgccでは -std=gnu99 を指定しない
(Damien Doligez, report by ygrek)
- MPR#7452, GPR#1228: Skylake/Kaby lakeのバグを回避するためにGCCのオプションを調節してみる
(Damien Doligez, review by David Allsopp, Xavier Leroy and Mark Shinwell)
- GPR#693: マニュアルの caml_example 環境内で予期しないエラーが発生した場合は失敗するように
(Florian Angeletti)
- GPR#803: ocamllexベースの、Cヘッダからバイトコードコンパイラのopcodeを抽出するツール
(Nicolas Ojeda Bar)
- GPR#827: インストール漏れのmliファイルとcmtiファイルをインストールする。新たな Makefile 規則 install-compiler-sources は compiler-libs 関連のmlファイルをインストールする
(Hendrik Tews)
- GPR#887: Linux上で clang を使っている場合は -with-frame-pointers オプションを許す
(Bernhard Schommer)
- GPR#898: primitive一覧の並び順がロカールに依存しないように(reproducible-builds.org で検出された)
(Hannes Mehnert, review by Gabriel Scherer and Ximin Luo)
- GPR#907: ビルドシステムで使っていない変数を削除
(Sébastien Hinderer, review by whitequark, Gabriel Scherer, Adrien Nader)
- GPR#911: ビルドシステムで使っているCコンパイラ関連の変数を明確化
(Sébastien Hinderer, review by Adrien Nader, Alain Frisch, David Allsopp)
- GPR#919: clangをコンパイラとして使っている場合は clang をアセンブラとして使う
(Bernhard Schommer)
- GPR#927: configureスクリプトでの #! サポート検出を改良
(Armaël Guéneau)
- GPR#932: optターゲットをビルドして、 opt.opt ターゲットをビルドしていない場合の ocaml{c,lex}->ocaml{c,lex}.byte のシンボリックリンクを正しくインストールする
(whitequark, review by Gabriel Scherer)
- GPR#935: Androidの termux 上でビルドできるように
(ygrek, review by Gabriel Scherer)
- GPR#984: Spacetimeを有効にしているときのコンパイルを修正
(Mark Shinwell)
- GPR#991: Windows上でネイティブコンパイラをビルドしない場合のインストールを修正
(Sébastien Hinderer, review by David Allsopp)
- GPR#1047: Cソース向けの .depend ファイルの生成をよりポータブルに
(Sébastien Hinderer, review by Xavier Leroy and David Allsopp)
- GPR#1076: ocamlyacc のビルドをシンプルに
(Sébastien Hinderer, review by David Allsopp)
コンパイラ自体のビルド: Makefileの機能分割
OCamlコンパイラ自体のビルドシステム(コンパイラをビルドするためのMakefile群)は伝統的にUnix用とWindows用に分かれていたが、これは、コードの重複とビルドの微妙な違いの原因であったし、一般に—コンパイラ開発者にとってだけでなく、クロスコンパイルをする人や新しいアーキテクチャへのポーティングをする人にとっても—技術的負債であった。 4.05 の開発中に、 Sébastien Hinderer がビルド規則を整合させ、ふたつのビルドシステムを統合した。
変更点の完全なリストは以下の通り
- GPR#705: Cygwin以外のWindowsポートでも ocamlnat がビルドされるように Makefile.nt を更新
(Sébastien Hinderer, review by Alain Frisch)
- GPR#729: ocamlnat が $(EXE) 拡張子付きでビルドされるようにし、 Unix 用と Windows 用の Makefile のビルド規則を統合
(Sébastien Hinderer, review by Alain Frisch)
- GPR#762: yacc/ 以下のビルドシステムを統合
(Sébastien Hinderer, review by David Allsopp, Alain Frisch)
- GPR#764: debugger/ 以下のビルドシステムを統合
(Sébastien Hinderer, review by Alain Frisch)
- GPR#785: otherlibs/systhreads/ 以下のビルドシステムを統合
(Sébastien Hinderer, review by Alain Frisch, David Allsopp, testing and regression fix by Jérémie Dimino)
- GPR#788: otherlibs/ のサブディレクトリ以下のビルドシステムを統合
(Sébastien Hinderer, review by Alain Frisch)
- GPR#808, GPR#906: ocamldoc/ 以下のビルドシステムを統合
(Sébastien Hinderer, review by Alain Frisch)
- GPR#812: tools/ 以下のビルドシステムを統合
(Sébastien Hinderer, review by Alain Frisch)
- GPR#866: stdlib/ 以下のビルドシステムを統合
(Sébastien Hinderer, review by David Allsopp and Adrien Nader)
- GPR#941: asmrun/ 以下のビルドシステムを統合
(Sébastien Hinderer, review by Mark Shinwell, Adrien Nader, Xavier Leroy, David Allsopp, Damien Doligez)
- GPR#981: byterun/ 以下のビルドシステムを統合
(Sébastien Hinderer, review by Adrien Nader)
- GPR#1033, GPR#1048: ルートディレクトリのビルドシステムを統合
(Sébastien Hinderer, review by Adrien Nader and Damien Doligez, testing and regression fix by Andreas Hauptmann)
コンパイラ内部/compiler-libs の変更
- GPR#673: lambda 内でブロックフィードの初期化と書き換えを区別する
(Frédéric Bour, review by Xavier Leroy, Stephen Dolan and Mark Shinwell)
- GPR#744, GPR#781: .cmti ファイル内でインポートした cmi_crcs 内の自己参照が重複していたのを修正。 .cmti ファイルを作成するときに cmi_info を再計算しないように
(Alain Frisch, report by Daniel Bünzli, review by Jérémie Dimino)
- GPR#881: Outcometree.out_variant をより一般的に Ovar_name of out_ident * out_type list を Ovar_type of out_type に変更
(Valentin Gatien-Baron, review by Leo White)
- GPR#908: s390x バックエンドの PIC の扱いをリファクタリング
(Gabriel Scherer, review by Xavier Leroy and Mark Shinwell)
バグ修正
- MPR#5115: byterun/fail.c のすべての関数で caml_global_data が初期化されていない場合をチェックする(バイトコード版のみ振る舞いが変化する)
(Gabriel Scherer, review by Xavier Leroy)
- MPR#6136, GPR#967: 関数に余分な引数を渡とたときの評価順序がバイトコードコンパイラとflambdaで一致するようにClosureを修正
(Mark Shinwell, report by Jeremy Yallop, review by Frédéric Bour)
- MPR#6550, GPR#1094: macOS 上で空の .cmxa ファイルを作れるように
(Mark Shinwell)
- MPR#6594, GPR#955: x86-64 の Istore_symbol 固有の操作を削除。こうすることでより頑健になり、特に Win64 でのアセンブラエラーを回避できる
(Mark Shinwell, review by Xavier Leroy, testing by David Allsopp and Olivier Andrieu)
- MPR#6903: Cygwin 上で Unix.execvpe が環境を変化させない
(Xavier Leroy, report by Adrien Nader)
- MPR#6987: おそらく(多相バリアントと)全称変数の逸出で奇妙なエラーメッセージが出る
(Jacques Garrigue, report by Mikhail Mandrykin and Leo White)
- MPR#7216, GPR#949: Functor((val x)) で括弧を2重にする必要がないように
(Jacques Garrigue, review by Valentin Gatien-Baron)
- MPR#7331: ocamldoc: モジュールの自身に対する別名 module rec M : sig end = M がある場合に、無限ループしないように
(Florian Angeletti, review Gabriel Scherer)
- MPR#7346, GPR#966: flambdaでコンパイルしたときに、式が並び換えられて評価順序の問題が起こるのを修正。これにより、ネイティブコードコンパイラとバイトコードコンパイラで(flambdaなしでも)評価順序が異なる例もひとつ修正されている
(Mark Shinwell, Leo White, code review by Pierre Chambart)
- MPR#7348: private な列変数がスコープを逸出することがある
(Jacques Garrigue, report by Leo White)
- MPR#7407: あまり標準的でない C のイディオムがふたつ SUNWSPro コンパイラに拒否されていた
(Xavier Leroy)
- MPR#7421: GADTsとlazyを組み合わせたときの健全性バグ
(Jacques Garrigue, report by Leo White)
- MPR#7424: unboxedアノテーション付きの型宣言で型検査器が発散する
(Jacques Garrigue, report by Stephen Dolan)
- MPR#7426, GPR#965: オブジェクトのコンパイル中に Fatal error になるのを修正(さらに Pfield_computed と Psetfield_computed プリミティブを追加)
(Mark Shinwell, report by Ulrich Singer)
- MPR#7427, GPR#959: Cmmgen で let の本体部分を消さない
(Mark Shinwell, report by Valentin Gatien-Baron)
- MPR#7432: -labels 付きと -nolabels 付きでコンパイルしたモジュールをリンクするのが安全でない
(Jacques Garrigue, report by Jeremy Yallop)
- MPR#7437: nonrec な private 型で assert failure する
(Jacques Garrigue, report by Anil Madhavapeddy)
- MPR#7438: warning +34 が private な変数の列変数を #row として表示してしまう
(Alain Frisch, report by Anil Madhavapeddy)
- MPR#7443, GPR#990: パターン内で局所openすると余計なunused open警告が出る
(Florian Angeletti, report by Gabriel Scherer)
- MPR#7504: warning 8での、制約なしのレコード値の表示を修正
(Florian Angeletti, report by John Whitington)
- MPR#7456, GPR#1092: 似たようなデバッグ情報位置エントリがあるファイルのコンパイルが遅くなるのを修正
(Mark Shinwell)
- GPR#795: Sys.executable_nameの256文字制限を撤廃
(Xavier Leroy)
- GPR#805, GPR#815, GPR#833: String.concat 内のintのオーバーフローをチェック
(Jeremy Yallop, review by Damien Doligez, Alain Frisch, Daniel Bünzli, Fabrice Le Fessant)
- GPR#881: short-paths が多相バリアントに適用されないことがあった
(Valentin Gatien-Baron, review by Leo White)
- GPR#886: Ctype.moregeneral の row_name の扱いを修正
(Leo White, review by Jacques Garrigue)
- GPR#934: Bytes.extend内でintのオーバーフローをチェックする
(Jeremy Yallop, review by Gabriel Scherer)
- GPR#956: * 0 を最適化するとき、副作用の起こる可能性のある式を保存する
(Jeremy Yallop, review by Nicolás Ojeda Bär, Xavier Leroy and Mark Shinwell)
- GPR#977: ocamldebug の list コマンドで発生する Out_of_range を捕捉する
(Yunxing Dai)
- GPR#983: 副作用のある式を Closure で取り除かないようにし、さらに副作用のない式はより多く取り除くように
(Alain Frisch, review by Mark Shinwell and Gabriel Scherer)
- GPR#987: alloc_sockaddr: ヌル終端を仮定しない。 macOS ではシステムコール(例えば getsockname)で struct sockaddr に埋められるものではヌルが挿入されない
(Anton Bachin)
- GPR#998: 未使用のクロージャを un_anf.ml で削除しない
(Leo White, review by Mark Shinwell and Pierre Chambart)
- GPR#1019: flambda の "[functions] does not map set of closures ID" fatal error を修正
(Pierre Chambart, code review by Mark Shinwell and Leo White)
- GPR#1075: サイズ0の float 配列はタグが 0 になることを保証する
(Mark Shinwell, Leo White, review by Xavier Leroy)
- * GPR#1088: Gc.minor_words が精確な数を返すように
(Stephen Dolan, review by Pierre Chambart and Xavier Leroy)
|