Я написал простой код OCaml, например:
let rec fib(n: int) =
match n with
| 0 -> 0
| 1 -> 1
| _ -> fib(n-1) + fib(n-2)
С опцией -dcmm
для ocamlopt
я мог бы генерировать .cmm
файлы следующим образом:
cmm:
(data)
(data int 3063 "camlTest__1": addr "camlTest__fib_267" int 72057594037927941)
(data int 1792 global "camlTest" "camlTest": int 1)
(data
global "camlTest__gc_roots"
"camlTest__gc_roots":
addr "camlTest"
int 0)
(function{test.ml:1,11-88} camlTest__fib_267 (n/268: val)
(if (!= n/268 1)
(if (!= n/268 3)
(+
(+ (app{test.ml:5,9-17} "camlTest__fib_267" (+ n/268 -2) val)
(app{test.ml:5,20-28} "camlTest__fib_267" (+ n/268 -4) val))
-1)
3)
1))
(function camlTest__entry ()
(let clos/271 "camlTest__1" (store val(root-init) "camlTest" clos/271)) 1)
(data)
ocamlopt
могу скомпилировать код OCaml (.ml
) в машинный код, а затем могу ли я генерировать машинный код непосредственно из .cmm
файлов?
Я не нашел опции, позволяющей компилировать .cmm
файлы в машинный код в ocamlopt
, поэтому попробовал использовать Asmgen
в модулях ocaml-base-compiler
.
Однако функция Asmgen
требует типа Cmm.phrase
, но не нашла, как преобразовать файлы .cmm
в тип Cmm.phrase
.
Я позвонил ocamlopt -dcmm test.ml > test.cmm
, чтобы сгенерировать .cmm
файл
Флаги компилятора OCaml, начинающиеся с -d...
, — это флаги отладки, в основном предназначенные для разработчиков компиляторов. Флаг -dcmm
не является исключением, и его вывод не может быть прочитан компилятором (и, вероятно, является неполным).
Как именно вы вызвали ocamlopt для создания показанного содержимого файла?