Улучшение лямбда-кода, генерируемого OCaml для утверждений.

Я хотел бы улучшить лямбда-код, созданный для конструкции "assert" OCaml 3.12.1. Вот пример:

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), а также для хранения и повторного использования с хэш-таблица времени компиляции. Для внутримодульной оптимизации изменения просто могут быть управляемыми (пока хеш-таблица сбрасывается на каждой единице компиляции).

Я немного не в теме, особенно «сброс при каждой компиляции». часть». Любая подсказка?

10
задан Pascal Cuoq 4 April 2012 в 09:36
поделиться