考虑以下两个代码生成器:
(echo "class foo = object" ; for ((i = 0; i < 2000; i++)) do echo method x$i = $i; done ; echo end) > test.ml
和
(echo "" ; for ((i = 0; i < 2000; i++)) do echo let x$i = $i; done ; echo) > test.ml
前者使用可扩展的方法创建一个大类,而后者使用(顶层)模块执行相同的操作。
尽管如此,编译器的行为却大不相同:
% time ocamlc test.ml
ocamlc test.ml 19,89s user 0,01s system 99% cpu 19,950 total
% time ocamlc test.ml
ocamlc test.ml 0,29s user 0,01s system 99% cpu 0,305 total
如果您使用循环限制,您会注意到模块可以在线性时间内编译,而类#&编译是二次的。我想知道是什么导致了这个问题,是否有办法避免它?
OCaml的类实现是否真的固有二进制编译过程?如果是这样,是否有一种语义等效的方式来分割工作并加快速度(即继承)?我必须生成大型类,因为我依赖于类方法的后期绑定。