OCaml编译器是否支持真正的模块别名?

4

我创建了一个新模块,它只是一个非常长名字的模块的缩写:

module M = ModuleWithLongName

我处于一个最终可执行文件大小很重要的情况。上述结构是否被编译器合理处理(即M只是一个别名),还是在定义M的模块中完全复制了ModuleWithLongName的所有内容?

3个回答

8
不,OCaml语言不支持“真正的模块别名”。
但是,您可能不会注意到,直到您尝试相当高级的functor和抽象类型组合。特别是,在程序的运行时行为中,您只能观察到这个问题在类型系统中:有时模块被复制,但可变状态将在副本之间别名(在您的示例中,如果ModuleWithLongName.foo是一个可变引用,则M.foo是相同的引用)。
如果您使用一等模块,或在深度嵌套的函数中定义本地模块,您可能会观察到模块复制操作作为整体计算中不可忽略的成本。正确的心理模型来推断一等模块的性能是,在类型检查和模块检查之后,它们就是准确的记录。

2

0

这是一个模块路径的别名,我想。

模块 moduleName = module_expr

其中 module_expr ::= module_path | ...

请参见module_expr production syntax


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接