我编写了简单的 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
类型。
-d...
开头的OCaml 编译器标志是主要针对编译器开发人员的调试标志。
-dcmm
也不例外,它的输出无法被编译器读回(并且可能不完整)。