Me gustaría mejorar el código lambda generado para el constructo "assert" OCaml 3.12.1. Aquí está un ejemplo:Mejorando el código lambda OCaml genera para las aserciones
let f x =
assert (x = 4);
assert (2 + x = 6);
assert (x - x = 0);
exit x
El longfilename.ml archivo anterior es representativa de grandes módulos OCaml para que me gustaría generación lambda-código a ser mejorado. Se compila a:
$ 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
...
Lo anterior es terriblemente redundante. El nombre del archivo fuente de donde proviene cada afirmación está duplicado. El culpable parece ser 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)]))])])
;;
En vista de ello, parece que sería suficiente para dar un nombre a Const_base(Const_string fname)
, y para almacenar y reutilizar con un de compilación tiempo hash-table. Para la optimización intramódulo, , los cambios pueden ser manejables (siempre que la tabla hash se restablezca en cada unidad de compilación).
Estoy un poco fuera de mi alcance aquí, especialmente la parte de "reinicio en cada compilación ". ¿Alguna pista?
Yo sé que no es tan etiqueta para publicar un comentario cuando se puede simplemente aceptar la respuesta, pero quería felicitarle por la solución que ofreciste Bien hecho. –
Bueno, gracias :) Esto puede parecer menos satisfactorio una vez que haya enviado una propuesta de cambio en [bugtracker] (http://caml.inria.fr/mantis/), y las personas que realmente saben esto le dicen cómo mala fue la idea. – gasche
Prefiero reservar toda la atención que aún pueda invocar sobre el rastreador de problemas para las fechorías a las que no tengo la solución, pero no dude en opinar sobre 5573. Si encuentro una solución para eso, enviaré su solución para este uno como un parche merecedor de revisión. –