OCaml4.00.0の変更点

このページは最後に更新されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

last mod. 2012-07-28 (土) 21:42:31

http://caml.inria.fr/pub/distrib/ocaml-4.00/notes/Changes の翻訳です


OCaml 4.00.0 の変更点:

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

  • 言語の公式名称が OCaml に

言語機能

  • 一般化代数データ型(Generalized Abstract Data Types, GADTs)を追加。説明はリファレンスマニュアルの「言語拡張」の章を参照。
  • 第一級のモジュールを packing / unpacking する際の型アノテーションが省略可能に。型検査器が文脈から型を推論する。 -principal オプションを使うことで前方互換性を保証することができる。
  • パターンの構文に (module M) と (module M : S) を追加。第一級のモジュールをその場で unpack することができる。

コンパイラ共通

  • let-alias の簡単化の改良 (PR#5205, PR#5288)
  • .cmi ファイル中のコンパイラバージョンの不一致がわかりやすく報告されるように。
  • * 警告 28 がデフォルトで有効に。
  • 新しいオプション: -absname。 エラーメッセージで絶対パスを使う。
  • (fun x y -> e) a b のようなコンパイル時の β 簡約基を最適化して消す。
  • 型付きの抽象構文木を出力する -bin-annot オプションの追加。
  • 変数、 open、フィールド、構成子等の未使用を警告するオプションの追加。
  • * 警告 7 の意味を変更。 method でメソッドを上書きした場合に警告。この警告を避けるには method! を使う

ネイティブコードコンパイラ

  • 部分適用した関数の扱いの最適化 (PR#5287)
  • 配列の境界チェックのコードを若干改良 (PR#5345, PR#5360).
  • * 新しい ARM バックエンド (PR#5433):
    • Linux/EABI (armel) と Linux/EABI+VFPv3 (armhf) 両方をサポート
    • Thumb-2 命令セットのサポートの追加。コード量平均 28% 削減
    • 位置独立コード、 natdynlink、プロファイリング、例外バックトレースのサポートの追加
  • CFI 情報や、デバッグ用(-g オプションを付けた場合)のファイル名・行番号アノテーションの生成。これにより特に、 gdb でのデバッグ時に精確なスタックトレースが出るようになる。現在のところ x86 32-bit と 64-bit のみサポート。 (PR#5487)
  • 新ツール: ocamloptp。ネイティブコードコンパイラ用の ocamlcp

OCamldoc:

  • PR#5645: ocamldoc がシグネチャ中の module / type の代入を扱わない
  • PR#5544: HTML 出力の改善(HTML による整形を減らす)
  • PR#5522: レコードフィールドやバリアントコンストラクタを参照できるようにする
  • PR#5419 (フランス語のエラーメッセージ)の修正
  • PR#5535 (dump+load するとクラスへのクロスリファレンスが出ない)の修正
  • * カスタムジェネレータに第一級のモジュールを使うように変更。様々なプラグインを読み込んでジェネレータに機能を追加可能に
  • * PR#5507: 位置を表すのに Location.t を使うように
  • 修正: コードを保存しないように指示されたらコードを保存しないように

標準ライブラリ

  • 浮動小数点数関数 hypot と copysign の追加 (PR#3806, PR#4752, PR#5246)
  • * Arg: ドキュメント文字列が空のオプションを usage_string に含めない (PR#5437)
  • Array: より高速な blit, copy, sub, append, concat の実装 (PR#2395, PR#2787, PR#4591)
  • * Hashtbl:
    • Murmur 3 にもとづく統計的により良質な汎用ハッシュ関数 (PR#5225)
    • -0.0 と NaN に対する汎用ハッシュ関数の振る舞いの修正 (PR#5222)
    • Hashtabl.create に衝突パターンをランダム化するための省略可能パラメータ random を追加。安全性の向上 (PR#5572, CVE-2012-0839)
    • randomize 関数の追加と、デフォルトでランダム化を有効にするためのパラメータ R を OCAMLRUNPRAM に追加 (PR#5572, CVE-2012-0839)
    • 新たなファンクタインタフェース MakeSeeded? の追加。ユーザ指定の初期値でランダム化するハッシュ関数をサポートする
    • C プログラム用に <caml/hash.h> ヘッダをインストール
  • Filename: temp_file で使う擬似乱数生成器の初期化を lazy に
  • Marshal: (Marshal.Closures 時の)関数値のマーシャリングが、動的に読み込んだモジュール由来の関数にも動作するように (PR#5215)
  • Random:
    • /dev/urandom が使用可能な場合(例えば、 Linux, FreeBSD, MacOS X, Solaris)に初期化(Random.self_init())がよりランダムに
    • * Random.float のより高速な実装(生成される数列は以前と異なる)
  • Set と Map: より効率的な filter と partition の実装
  • String: 新しい関数 map (PR#3888)

インストール

  • コンパイラ内部ライブラリが `ocamlc -where`/compile-libs にインストールされる。コンパイラモジュール用の .cmi インタフェースに加えて以下のライブラリがインストールされる。 (PR#1804, PR#4653, 要望の多かった機能)
    • ocamlcommon.cma/.cmxa — ocamlc, ocamlopt, ocaml 共通のモジュール
    • ocamlbytecomp.cma/.cmxa — ocamlc, ocaml 用のモジュール
    • ocamloptcomp.cma/.cmxa — ocamlopt 用のモジュール
    • ocamltoplevel.cma — ocaml 用のモジュール
  • * `ocamlc -where` にインストールされていたトップレベル用モジュールのうち `ocamlc -where`/compiler-libs にインストールされるようになったものがある。必要に応じて -I +compiler-libs を追加すること。
  • * toplevellib.cma はインストールされなくなった。 ocamlcommon.cma ocamlbytecomp.cma ocamltoplevel.cma が代わりになる。
  • デバッグ版の実行時システムをコンパイル/インストールする configure オプション(-with-debug-runtime)と、デバッグ用実行時システムを選択するためのコンパイラオプション(-runtime-variant)の追加

バグ修正:

  • PR#1643: Lazy モジュールの lazy_ で始まる関数を非推奨に。接頭辞なし版を追加。
  • PR#3571: Bigarrays で unmapping 前に msync() を呼び変更をコミット
  • PR#4292: ドキュメント関連の様々な問題
  • PR#4511, PR#4838: 局所モジュールで多相性がなくなる
  • * PR#4549: Filename.dirname が Unix 上で複数個の / の並びを扱えていない
  • PR#4688: (Windows) 浮動小数点の特殊な値が正しく文字列に変換されない
  • PR#4697: Unix.putenv が失敗時にメモリリークする
  • PR#4705: camlp4 で `True や `False を含む型を定義できない
  • PR#4746: Linux 上で、ネイティブコードのスタックオーバーフロー検出が正しくない
  • PR#4869: アセンブリのコード/データ用ラベルが稀に衝突する
  • PR#4880: assert が例外バックトレースで表示されるようにする
  • PR#4892: Array.set が第三引き数を評価する前に "out of bounds" を発生させることがある
  • PR#4937: option が再定義されていると、 camlp4 が省略可能引き数の扱いを間違える
  • PR#5024: camlp4r がレコードの反駁不可パターン中の _ を扱えるようになった
  • PR#5064, PR#5485: C の関数を呼ぶ前にスタックが 4K 語利用可能であることを保証するよう試みる。できなければ Stack_overflow 例外を発生させる。これにより、 C コード中でのセグメンテーションフォールトを(なくせはしないが)減らすことができる。
  • PR#5073: 'Unbound record field label' エラーの場所がうまくない
  • PR#5084: ネイティブコードコンパイルで sub-sub-module のビルドに失敗する
  • PR#5120: Camlp4.Debug.formatter の出力関数の修正
  • PR#5131: カスタムランタイムを g++ でコンパイルすると多量の警告が出る
  • PR#5137: caml-types-explore が動かない
  • PR#5159: type Lexing.position のドキュメントの改善
  • PR#5171: Map.join が必要以上の比較をする
  • PR#5176: emacs mode: 正規表現マッチャでスタックオーバーフロー
  • PR#5179: mingw-w64 への OCaml の移植
  • PR#5211: Genlex のドキュメントを修正。予約語 parser と関連する記法を使うには camlp4 が必要なことを明記
  • PR#5214: ocamlfind プラグインが cut (1) コマンドを使う
  • PR#5218: Makefile 中で make ではなく $(MAKE) を使う
  • PR#5224: non-regular な型のエラーメッセージがわかりにくい
  • PR#5231: camlp4: <:str_item< type t = $x$ >> の構文解析の修正
  • PR#5233: weak array のファイナライザでぶらさがりポインタ(のちクラッシュ)
  • PR#5238, PR#5277: エラー位置を取得しようとして Sys_error
  • PR#5261, PR#5497: Ocaml ソースコード例がコピーアンドペースト可ではない
  • * PR#5279: 実行ファイルの名前が caml_startup_code で正しく初期化されていない
  • PR#5290: チャネル、 nat、 mutex、 condition 用のハッシュ関数
  • PR#5295: OS threads: caml_c_thread_unregister() に関する問題
  • PR#5301: camlp4r でパラメータ付きの例外型についての等式
  • PR#5305: _build/ 内へのリンクがあっても ocamlbuild が文句を言わないようにする
  • PR#5306: Thread.self() を比較すると実行時例外が発生する
  • PR#5309: Queue.add が thread/signal セーフでない
  • PR#5310: Ratio.create_ratio/create_normalized_ratio は誤解を招く名前である
  • PR#5311: 警告 23 によりわかりやすいメッセージ
  • * PR#5312: "-w @..." との衝突を避けるため、 Windows 版 OCaml ランタイムからコマンドラインの @responsefile の自動展開機能を削除
  • PR#5313: ocamlopt -g が最適化をしない
  • PR#5316: 可能ならば objinfo で ccopts/ccobjs/force_link を表示する
  • PR#5318: マーシャリングしたデータを読んでいるときにスタックオーバーフローすると segfaulf する
  • PR#5319: Windows AMD64 ネイティブコードコンパイルで、 %r11 が Lswitch により上書きされる
  • PR#5322: 全称量化付きの型変数に展開される型略記
  • PR#5325: (Windows) あるスレッドが Unix.recv でブロックし、別のスレッドが Unix.send でブロックする
  • PR#5328: Windows で Unix.select 後、ソケットが non-blocking モードになる
  • PR#5330: thread タグと、 .top または .inferred.mli ターゲット
  • PR#5331: ocamlmktop はシェルスクリプトでない場合もある
  • PR#5335: clearenv 後 Unix.environment すると segfault
  • PR#5338: (mingw) sanitize.sh の改行コードが Windows スタイルになっている
  • PR#5343: ocaml -rectypes がモジュールの部分型関係において健全でない
  • PR#5344: 定義済みの例外で特別な表示が必要なものがある
  • PR#5349: Hashtbl.replace は古いキーを再利用するのではなく新しいキーを使う
  • PR#5356: ocamlbuild での ocamlfind 用の predicate の扱い
  • PR#5364: "((val m : SIG1) : SIG2)" がうまくコンパイルされない
  • PR#5370: ocamldep が syntax error 時にファイル名を表示しない
  • PR#5374: camlp4 が型定義に対して間違った位置情報を作成する
  • PR#5380: 変な sscanf への入力で segfault
  • PR#5382: EOPNOTSUPP と ENOTSUPP が異なるプラットフォールがある
  • PR#5383: Win32/MSVC でビルド失敗
  • PR#5387: camlp4: str_item とその他の Nil のある構文要素があまり使いやすくない
  • PR#5389: コンパクション後、巨大なヒープが残ることがある
  • PR#5393: GNU/kFreeBSD で、 -R リンクオプションのせいでソースからのビルドに失敗する
  • PR#5394: manpage に -dtypes オプションの説明がない
  • PR#5397: Filename.temp_dir_name は変更可能であるべき
  • PR#5410: Camlp4 のクラス適用の表示を修正
  • PR#5416: (Windows) Unix.(set|clear)_close_on_exec で blocking mode を保存する
  • PR#5435: Windows で ocamlbuild が .opt な実行ファイルを見つけてくれない
  • PR#5436: unmarshal 時にオブジェクトの id を更新する
  • PR#5442: camlp4: 文字列のクォーテーション問題
  • PR#5453: Ubuntu/MultiarchSpec? で configure が X11 を見つけてくれない
  • PR#5461: バイトコードモジュールの二重リンク
  • PR#5463: Bigarray.*.map_file で空の配列を map しようとすると失敗する
  • PR#5465: Windows 環境の ocamlopt.opt のスタックサイズを増加
  • PR#5469: ファンクタ適用で生成された prevate なレコード型に略記がない
  • PR#5475: LablTk? のラッパースクリプトのコマンドライン引き数の扱いがまずい
  • PR#5476: float 配列に対する let rec のネイティブコンパイルに関するバグ
  • PR#5477: Linux 上で graphics ライブラリの設定に pkg-config を使う
  • PR#5481: camlp4 のマジックナンバーの更新
  • PR#5482: テストスクリプト中の bash 依存を削除
  • PR#5495: camlp4o が (or) の中置定義で死ぬ
  • PR#5498: 空のオブジェクトの単一化が最初のメソッドの有無しかチェックしない
  • PR#5503: ocamlbuild にビルドディレクトリとして絶対パスを渡した場合のエラー
  • PR#5509: 静的に割り当てられた空の配列を未使用データ領域の先頭に割り当てて分類を間違える
  • PR#5510: ocamldep の -ml{,i}-synonym オプションが重複している
  • PR#5511: Bigarray.reshape で、戻り値の配列の次元に不当な制限がある
  • PR#5513: Int64.div で浮動小数点例外が発生する (ocamlopt, x86)
  • PR#5516: Bigarray C スタブで、可能であれば、 C99 形式の可変長配列を使う
  • PR#5518: lazy な空の配列で segfault
  • PR#5531: ocamlbuild の -docflag 及び -docflags オプション経由で ocamldoc のフラグを渡せるように
  • PR#5543: Bigarray.map_file でファイルを大きくするときに lseek() を使わないようにする
  • PR#5538: ocamlc の -i と -annot の組み合わせ
  • PR#5648: (probably fixed) tests/lib-threads のテスト失敗
  • PR#5551: 繰り返し find_in_path を呼ぶとパフォーマンスが低下する
  • PR#5552: Mac OS X: unrecognized gcc option "-no-cpp-precomp"
  • PR#5555: ハッシュ表の bucket table を初期サイズにサイズ変更する Hashtbl.reset を追加
  • PR#5560: -principal を付けるとタプルパターンで型が非互換になる
  • PR#5575: 乱数の状態をアーキテクチャをまたいで marshal できない
  • PR#5579: camlp4: トップレベルでプラグインを読み込むと、 syntax error が起こるまで Token.Filter.define_filter の効果がない
  • PR#5585: typo: "explicitely"
  • PR#5587: ドキュメント: "allows to" は間違った英語
  • PR#5593: -ouput-obj に失敗したら C ファイルを削除する
  • PR#5597: バイトコード組み込みアプリケーションでプリミティブの名前を insttrace 用に登録しておく
  • PR#5598: ocamllex の文字列に `\ ' のサポートを追加
  • PR#5603: ocamlopt -g で間違った .file デバッグ情報が生成される
  • PR#5604: ocamlbuild が作成したファイルのパーミッションを修正
  • PR#5610: PR#5318 の新しい unmarshal がオブジェクト id の更新に失敗する
  • PR#5614: ocamldoc.opt コンパイル時に -linkall 付け忘れ
  • PR#5616: ocamlbuild のドキュメントをリファレンスマニュアルに移動
  • PR#5619: コンパイラの CType.Unify 例外を捕捉していなかった
  • PR#5620: (camlp4 revised syntax) type manifest の出力が不正
  • PR#5637: (camlp4 revised syntax) 無名型パラメータの出力が不正
  • PR#5643: ocamlopt -g で生成された .cfi 及び .log 指示子に関する問題
  • PR#5644: Sapp や Slazy ノードと同時に使うと Stream.count が壊れる
  • PR#5647: デバッガ中で install_printer が使えない
  • PR#5651: (camlp4 revised syntax) 抽象データ型用のプリンタ
  • PR#5654: self パターン変数の位置情報の調節
  • PR#5655: ocamlbuild が C スタブをビルドするときに cflags を渡さない
  • PR#5657: レコードフィールドの略記時にエラーの位置がまずい
  • PR#5659: MSVC 環境で ocamlmklib -L が壊れている
  • PR#5661: テストスィートの修正
  • PR#5668: Camlp4 が "let _ = ..." に対して不正な構文の出力
  • PR#5671: caml_final_custom_operations() 中での compare_ext フィールドの初期化
  • PR#5677: "value" を識別子として使わない (genprintval.ml)
  • PR#5687: (bytecode) "output-obj" main プログラムから dynlink が使えない
  • camlp4 で文字列リテラルを表示するときの問題 (caml-list での報告)
  • emacs mode: コメントと文字列の色付けが正しく動くようになった
  • forall とメソッドに関する問題 (caml-list 2011-07-26 の報告)
  • 不正な X に対して OCAMLRUNPARAM=a=X すると落ちる (reported in private)

機能追加

  • PR#352: 新しいオプション "-stdin"。 ocaml が標準入力をスクリプトとして読む
  • PR#1164: -a と .cmxa を混ぜた場合に、よりわかりやすいエラーメッセージ
  • PR#1284: ドキュメント: Stream の組み合わせに関する制限を削除
  • PR#1496: LIBDIR, BINDIR, MANDIR を $(PREFIX) に相対にできるように
  • PR#1835: Digest.from_hex の追加
  • PR#1898: toplevel: 入力継続用のプロンプトを表示しないようにするオプション
  • PR#4278: configure: graph ライブラリを無効にするオプション
  • PR#4444: 新しい関数 String.trim。文字列の先頭および末尾の空白を取り除く
  • PR#4549: Filename.dirname/basename を POSIX 準拠に
  • PR#4830: expunge.ml に -v オプションを追加
  • PR#4898: 計算機のエンディアンを見るための Sys.big_endian : bool
  • PR#4963, PR#5467: C スタブヘッダに extern "C" をつけない
  • PR#5199: ネイティブサポートがない場合や、 Makefile の変数 BYTECODE_ONLY が空でない場合は、バイトコード用のテストだけ実行する
  • PR#5215: dynlink されたクロージャのマーシャリング
  • PR#5236: 新しいプリミティブ。 'revapply x f = f x' の意味の '%revapply' と 'apply f x = f x' の意味の '%apply'。
  • PR#5255: powerpc, hurd, sparc での natdynlink 検出
  • PR#5295: OS threads: caml_c_thread_unregister() に関する問題
  • PR#5297: コンパイラが組み込みのプリミティブの存在をチェックするように
  • PR#5329: (Windows) fd がすべてソケットの場合により効率のよい Unix.select
  • PR#5357: 無用の open への警告
  • PR#5358: 第一級のモジュールがサブモジュールに対して with type 宣言を許さない
  • PR#5385: configure: MACOSX_DEPLOYMENT_TARGET が設定されているときに警告
  • PR#5396: ocamldep: -sort, -all, -one-line オブションの追加
  • PR#5397: Filename.temp_dir_name は変更可能であるべき
  • PR#5403: emacs が PATH 中に存在しない場合によりわかりやすいエラーメッセージを表示する
  • PR#5411: 新しいトップレベル指示子: #load_rec
  • PR#5420: Unix.openfile share mode (Windows)
  • PR#5421: Unix: open_proc* 関数で fd がリークしないように
  • PR#5434: win32unix で Unix.times を(部分的に)実装
  • PR#5438: 未使用の宣言に対する新たな警告
  • PR#5439: config.guess と config.sub を更新
  • PR#5445 ほか: ユーザー指定の名前で型を表示する
  • PR#5454: Digest.compare を追加。 md5 のドキュメントを更新
  • PR#5455: .emacs の説明。 ocaml スクリプトを認識するための設定
  • PR#5456: pa_macro: __LOCATION__ をマクロ展開後に置き換える。 LOCATION_OF を追加
  • PR#5461: bytecode: 同名のモジュールをふたつリンクしたときに警告を表示
  • PR#5478: ocamlopt が ar コマンドの存在を仮定している
  • PR#5479: Num.num_of_string が例外を発生させることがあるがドキュメントに反映されていない
  • PR#5501: IO_BUFFER_SIZE を 64KiB に増やす
  • PR#5532: バイトコードファイルが不正な場合のエラーメッセージを改善
  • PR#5555: ハッシュ表の bucket table を初期サイズにサイズ変更する Hashtbl.reset を追加
  • PR#5586: UNIX_BUFFER_SIZE を 64KiB に増やす
  • PR#5597: バイトコード組み込みアプリケーションでプリミティブの名前を insttrace 用に登録しておく
  • PR#5599: コンパイラの -w スイッチを制御するために ocamlbuild に warn() タグを追加
  • PR#5628: #remove_directory と Topdirs.remove_directory を追加。ロードパスからディレクトリを取り除く
  • PR#5636: システムスレッドライブラリでの pthread_atfork リンク問題
  • PR#5666: C のヘッダでリビジョン番号を提供していない
  • ocamldebug: コードポインタを格納している値を inspect する機能
  • ocamldebug: デバッグ対象の環境変数を設定するための environment 指示子の追加
  • configure: -no-camlp4 オプションの追加

減量

  • * Alpha, HPPA, IA64, MIPS 用のネイティブコード生成部を削除
  • * DBM ライブラリ(Unix DBM key-value ストアへのインタフェース)を配布物から削除。該当ライブラリは https://forge.ocamlcore.org/projects/camldbm/ で別プロジェクトとして存続
  • * MS Windows 用のトップレベルユーザーインタフェース OCamlWin? を配布物から削除。該当ライブラリは https://forge.ocamlcore.org/projects/ocamltopwin/ で別プロジェクトとして存続

その他の変更

  • インストール時に VERSION ファイルをライブラリディレクトリにコピー

新規 編集 添付