我想改進爲「assert」OCaml 3.12.1構造生成的lambda代碼。下面是一個例子:改進lambda代碼OCaml爲斷言生成
let f x =
assert (x = 4);
assert (2 + x = 6);
assert (x - x = 0);
exit x
上面的文件longfilename.ml是代表針對我想λ-代碼生成得到改善大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)
,以及存儲和使用 編譯期一重用實時哈希表。對於模塊內優化, 所做的更改可能是可管理的 (只要在每個編譯單元中重置了散列表)。
我在這裏稍微超出了我的深度,尤其是「在每個編譯器重置 單元」部分。任何提示?
我知道這不是那麼禮儀發表評論時,你可以簡單地接受了答案,但我想對你表示祝賀解決方案。做得好。 – 2012-04-04 14:59:31
好吧,謝謝:)一旦你提交了關於[bugtracker](http://caml.inria.fr/mantis/)的更改提議,這可能看起來不太令人滿意,而實際上知道這些東西的人會告訴你如何這個想法不好。 – gasche 2012-04-04 15:41:38
我寧願保留任何一點點注意力,我仍然可以在uglinesses的問題跟蹤器上召喚我,但我沒有解決方案,但隨時可以在5573上進行思考。如果我找到了解決方案,那麼我將爲此提交解決方案一個作爲一個值得審查的補丁。 – 2012-04-04 18:37:29