2013-12-09 74 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