在OCaml中使用functors本质上是在编译时运行代码(在这方面,我认为它们比Java泛型更接近C++模板)。
因此我的问题是:编译器在编译之前是否执行任何优化,或者它直接开始生成代码,或者它尝试在此之前执行任何优化?
这个问题更加实际。很多时候,我使用Map.Make或类似的functor来为给定类型生成map/hashtable等。当我在多个模块中使用它时,我开始感到担忧,因为我认为编译器会多次执行相同的操作(尤其是从脚本语言背景下来看,编译速度成为一个问题)。
那么我需要担心吗?如果我在多个模块中执行Map.Make(MyModule),编译器能否说“嘿,我刚刚用这个类型编译了这个functor,我可能不需要再次执行它”?
是的,我知道我可以有一个单独的utils模块并在其中运行所有functors,但我通常会避免utils-like-kitchen-sink modules。
因此我的问题是:编译器在编译之前是否执行任何优化,或者它直接开始生成代码,或者它尝试在此之前执行任何优化?
这个问题更加实际。很多时候,我使用Map.Make或类似的functor来为给定类型生成map/hashtable等。当我在多个模块中使用它时,我开始感到担忧,因为我认为编译器会多次执行相同的操作(尤其是从脚本语言背景下来看,编译速度成为一个问题)。
那么我需要担心吗?如果我在多个模块中执行Map.Make(MyModule),编译器能否说“嘿,我刚刚用这个类型编译了这个functor,我可能不需要再次执行它”?
是的,我知道我可以有一个单独的utils模块并在其中运行所有functors,但我通常会避免utils-like-kitchen-sink modules。
int
大小使得OCaml代码比Java代码更不可移植,而且这两种大小分别为31位和63位。 - Pascal Cuoq