"assert" OCaml 3.12.1コンストラクト用に生成されたラムダコードを改善したいと思います。ラムダコードの改善OCamlがアサーション用に生成する
let f x =
assert (x = 4);
assert (2 + x = 6);
assert (x - x = 0);
exit x
ファイルlongfilename.mlは、上記Iはラムダコード生成を向上させることを希望れる大OCamlのモジュールの代表的なものである:ここでは一例です。それはにコンパイルします:
$ ocamlopt -S longfilename.ml
$ cat longfilename.s
...
.data
.quad 3072
_camlLongfilename__2:
.quad L100007
.quad 9
.quad 9
.quad 2300
L100007: .L100007:
.ascii "longfilename.ml"
.byte 0
.data
.quad 3072
_camlLongfilename__3:
.quad L100006
.quad 7
.quad 9
.quad 2300
L100006: .L100006:
.ascii "longfilename.ml"
.byte 0
.data
.quad 3072
_camlLongfilename__4:
.quad L100005
.quad 5
.quad 9
.quad 2300
L100005: .L100005:
.ascii "longfilename.ml"
.byte 0
...
上記はひどく冗長です。各アサーションが発生する可能性のあるソースファイルの名前は複製されます。犯人はbytecomp/translcore.mlように表示されます。
let assert_failed loc =
(* [Location.get_pos_info] is too expensive *)
let fname = match loc.Location.loc_start.Lexing.pos_fname with
| "" -> !Location.input_name
| x -> x
in
let pos = loc.Location.loc_start in
let line = pos.Lexing.pos_lnum in
let char = pos.Lexing.pos_cnum - pos.Lexing.pos_bol in
Lprim(Praise, [Lprim(Pmakeblock(0, Immutable),
[transl_path Predef.path_assert_failure;
Lconst(Const_block(0,
[Const_base(Const_string fname);
Const_base(Const_int line);
Const_base(Const_int char)]))])])
;;
それの顔には、 Const_base(Const_string fname)
に名前を与えるには十分だろう、と 、コンパイルして、それを保存して再利用するように、それが見えますタイムハッシュテーブル。モジュール内最適化では、 (変更単位は、各コンパイル単位でハッシュテーブルがリセットされている限り、 )の管理が可能です。
私はここで少し戸惑っていますが、特に「編集時にはそれぞれのリセットを ユニット」としています。何かヒント?
私はそれはあなたが単純な答えを受け入れることができたときにコメントを投稿するSOエチケットではないのですけど、私はであなたを祝福したかったですあなたが提供したソリューションよくやった。 –
まあ、ありがとうございます:)これは、[bugtracker](http://caml.inria.fr/mantis/)に変更提案を提出すると、それほど満足のいくものにはならないかもしれません。実際にこのことを知っている人は、悪い考えがあった。 – gasche
私はむしろ少し注意を払うつもりですが、私は解決策を持たない醜さのために問題トラッカーで召喚することができますが、5573で自由に意見を出してください。私がその問題の解決策を見つけたら、 1つは、レビューに値するパッチです。 –