OCaml编译速度&函子

时间:2014-04-03 09:37:10

标签: compilation ocaml functor

在OCaml中使用仿函数本质上是在编译时运行代码(这样我认为它们更接近于C ++模板,然后是Java泛型)。

因此我的问题是:编译器在编译它们之前是否执行任何优化,或者它是否立即开始生成代码或是否尝试事先执行任何优化?

这个问题似乎更实际。我经常使用Map.Make或类似的函子为给定类型生成map / hashtable / etc。当我在多个模块中使用它时,我开始担心,因为我认为编译器会多次开始做同样的事情(并且编译速度开始成为我的问题,特别是来自脚本语言背景) 。 所以我需要担心吗?或者,如果我在多个模块中执行Map.Make(MyModule),编译器可以说" ohai我刚用这种类型编译了这个仿函数我可能不需要再次执行它?&# 34;

是的我知道我可以有一个单独的utils模块并在那里运行所有的仿函数,但我通常会尝试避免像utils-like-kitchen-sink模块。

1 个答案:

答案 0 :(得分:4)

  

编译器能够说“ohai我刚用这种类型编译了这个仿函数我可能不需要再做一次吗?”

您正在考虑模板通常由C ++编译器编译的方式。 ocamlcocamlopt的编译方案改为生成不需要复制的通用代码。

OCaml仿函数Map.Make仅针对可应用的所有模块编译一次。当您从iter拨打Map.Make(String)并从iter拨打Map.Make(Float)时,会执行相同的代码。或者当您从iterMap.Make的两个不同应用程序中运行String时。