分析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.mldriver/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

上一篇: Profiling the OCaml compiler

下一篇: How do I find out where the compiler spends its time?