分析OCaml编译器
背景信息(您不需要重复这些步骤来回答问题,这只是给出了一些背景):
我正在编译一个相当大的一组生成模块。 这些文件是Modelica原型输出到OCaml编译器,并反映Modelica标准库的Modelica类结构。
其主要特点是使用多态,开放递归的:每个方法都需要this
参数,它包含了最终的超类层次。 例如模型:
model A type T = Real type S = T end A;
被翻译成
let m_A = object
method m_T this = m_Modelica_Real
method m_S this = this#m_T this
end
并在使用前必须关闭:
let _ = m_A#m_T m_A
这似乎推迟了很多类型检查,直到超类层次被实际修复,这反过来又使得不可能编译最终的链接模块(在编辑相应文件中的注释以查看我的意思之后,尝试ocamlbuild Linkage.cmo
)。
不幸的是,由于代码库相当庞大并且使用了很多对象,所以类型结构可能不是根本原因,它可能是代码生成中的一些优化或缺陷(尽管我强烈怀疑typechecker)。 所以我的问题是:有没有办法以某种方式对ocaml编译器进行配置,以便在某个阶段(类型检查,中间代码生成,优化)结束并需要多长时间时发出信号? 任何进一步的见解我的特殊用例也是受欢迎的。
截至目前,还没有。
你可以自己做,编译器源码是开放的,你可以得到它们并修改它们以适应你的需要。
根据您使用的是ocamlc
还是ocamlopt
,您需要修改driver/compile.ml
或driver/optcompile.ml
以将定时器添加到编译过程中。
幸运的是,这已经为你在这里完成了。 只需使用选项-dtimings
或环境变量OCAMLPARAM=timings=1,_
编译-dtimings
。
更加容易的是,您可以下载opam Flambda开关:
opam switch install 4.03.0+pr132
ocamlopt -dtimings myfile.ml
注意:Flambda本身改变了编译时间(大多数是在键入后发生的),并且它与OCaml编译器的集成尚未确认。
在这方面,OCaml编译器是一个普通的OCaml程序。 我会使用穷人的分析器进行快速检查,例如使用pmp脚本。
链接地址: http://www.djcxy.com/p/85451.html