2015-07-03 88 views
1

背景资料(您无需重复上述步骤来回答这个问题,这只是给一些背景):剖析OCaml的编译器

我试图编译a rather large set of generated modules。这些文件是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编译器进行配置,以便在某个阶段(类型检查,中间代码生成,优化)结束并需要多长时间时发出信号?任何进一步的见解我的特殊用例也是受欢迎的。

+0

作为一个方面说明,在OCaml中以大写字母开始文件名被认为是不好的做法。 'linkage.cmo'会比'linkage.cmo'更好。 – PatJ

+1

如果你想分析ocaml编译器,我可以建议你使用“ocp-memprof”。 ocp-memprof的主页:http://memprof.typerex.org/ – alifirat

回答

4

截至目前,还没有。

虽然你可以自己动手,但编译器的源代码是open,你可以获取并修改它们以满足你的需求。

根据您使用的是ocamlc还是ocamlopt,您需要修改driver/compile.mldriver/optcompile.ml以在编译过程中添加计时器。

幸运的是,这已经为你做了here。只需编译选项-dtimings或环境变量OCAMLPARAM=timings=1,_即可。

更容易,你可以下载OPAM Flambda开关:

opam switch install 4.03.0+pr132 
ocamlopt -dtimings myfile.ml 

注:Flambda本身的变化编译时间(大部分内容输入后会发生),并将其纳入OCaml的编译器尚未证实。

0

OCaml编译器在这方面是一个普通的OCaml程序。我会用poorman's profiler进行快速检查,使用例如pmp脚本。