2013-12-09 76 views
0

我遇到以下问题。我正在玩OCaml类型检查器,并正在测试来自另一个项目的文件。但是,这些文件依赖于以前编译器版本编译的cmi和cmo文件。因此,我无法用我的编译器完全键入检查这些文件,因为它似乎无法识别这些cmo和cmi文件。有没有办法解决这个问题?Ocaml cmi文件---获取功能签名

请注意,我无法切换到旧的编译器版本,并且我没有这些cmo和cmi文件的源代码。我想过看OCaml文件,推断功能签名,并创建具有相同签名的新cmi和cmo文件。这可能会起作用,因为我只对类型检查感兴趣。但是,我认为可能有更好的方法。

回答

2

如果你是一个古老的OCaml编译器的类型编译的模块的纯粹的兴趣,最好的办法是:

  • 下载相应的旧OCaml的编译器的源代码
  • 使用旧建一个小工具OCaml代码加载cmi文件并将签名转储到文本中。如果你习惯OCaml编译器内部,你可以在不到一个小时内完成。
  • 的CMI文件中提取签名通过了新的编译器来MLI文件与工具
  • 类型MLI文件,并创建CMI文件,为新的编译器

复活的老CMO文件应该是非常非常困难。我担心,将它们与固定的cmi文件相关联应该会导致意想不到的结果。反编译cmo文件为ml源代码在理论上是可行的--- js_of_ocaml反编译cmo并创建(以某种方式)可读的JavaScript例如---但这是一项艰巨的任务。

+1

我做了类似的事情。我安装了旧版本的Ocaml,并运行了顶层:ocaml file.cmo。然后我只输入 module M = File ;; 它打印签名。 – bellpeace

+0

啊,它很简单,很好。我喜欢你的解决方案:-) – camlspotter

1

显而易见的是编译与您的新编译器的文件,而不只是看着它们。也许这太明显了,对不起。

我不知道有任何转储出cmi文件接口的工具。最接近的是ocamlobjinfo,但它远远不够。您可以尝试将cmo文件加载到旧的顶层。顶层会告诉你一个值的类型。

+0

我应该可能提到它:我没有这些cmi和cmo文件的源代码。 – bellpeace

+0

那么你怎么去“看看OCaml文件”? –

+0

我有我想打字检查的OCaml文件。这些文件依赖于某些cmi和cmo文件,这些文件是使用不同的版本编译的,而且我没有源代码。 – bellpeace