Tôi muốn cải thiện mã lambda được tạo cho cấu trúc "khẳng định" OCaml 3.12.1. Dưới đây là ví dụ:Cải thiện mã lambda-OCaml tạo ra cho các xác nhận
let f x =
assert (x = 4);
assert (2 + x = 6);
assert (x - x = 0);
exit x
Tệp longfilename.ml ở trên đại diện cho các mô-đun OCaml lớn mà tôi muốn tạo mã lambda được cải thiện. Nó biên dịch thành:
$ 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
...
Ở trên là rất dư thừa. Tên của tệp nguồn mà mỗi xác nhận có thể đến từ được sao chép. Thủ phạm dường như là 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)]))])])
;;
Trên mặt của nó, có vẻ như nó sẽ là đủ để đặt tên cho Const_base(Const_string fname)
, và để lưu trữ và tái sử dụng nó với một compile- băm thời gian. Đối với tối ưu hóa mô-đun nội bộ, các thay đổi chỉ có thể được quản lý (miễn là bảng băm được đặt lại tại mỗi đơn vị biên dịch).
Tôi có một chút về chiều sâu của mình ở đây, đặc biệt là phần "đặt lại ở mỗi phần biên dịch ". Bất kỳ gợi ý nào?
Tôi biết rằng không phải SO nghi thức để gửi nhận xét khi bạn có thể chấp nhận câu trả lời, nhưng tôi muốn chúc mừng bạn trên giải pháp bạn cung cấp. Làm tốt. –
Vâng, cảm ơn bạn :) Điều này có vẻ ít hài lòng hơn khi bạn đã gửi đề xuất thay đổi trên [bugtracker] (http://caml.inria.fr/mantis/) và những người thực sự biết nội dung này cho bạn biết cách xấu ý tưởng là. – gasche
Tôi thà dành chút ít sự chú ý mà tôi vẫn có thể triệu tập trên bộ theo dõi vấn đề cho những điều xấu mà tôi không có giải pháp, nhưng hãy thoải mái sử dụng 5573. Nếu tôi tìm ra giải pháp cho tôi, tôi sẽ gửi giải pháp của bạn một như một bản vá xứng đáng xem xét lại. –