2015-07-03 128 views
1

背景資料(您無需重複上述步驟來回答這個問題,這只是給一些背景):剖析OCaml的編譯器

我試圖編譯a rather large set of generated modules。這些文件是Modelica原型輸出到OCaml編譯器,並反映Modelica標準庫的Modelica類結構。

主要特點是使用多態開放式遞歸:每種方法都採用包含最終超類層次結構的this參數。因此,例如模型:

model A type T = Real type S = T end A; 

被翻譯成

let m_A = object 
      method m_T this = m_Modelica_Real 
      method m_S this = this#m_T this 
      end 

,並於使用前被關閉:

let _ = m_A#m_T m_A 

似乎推遲了很多的類型檢查,直到超類的層次結構實際上是固定的,這又使得不可能編譯最終的聯動模塊(編輯後編輯ocamlbuild Linkage.cmo在相應的文件中的意見,看看我的意思)。

不幸的是,由於代碼庫相當龐大並且使用了很多對象,因此類型結構畢竟不是根本原因,它可能是代碼生成中的一些優化或缺陷(儘管我強烈懷疑typechecker)。所以我的問題是:有沒有辦法以某種方式對ocaml編譯器進行配置,以便在某個階段(類型檢查,中間代碼生成,優化)結束並需要多長時間時發出信號?任何進一步的見解我的特殊用例也是受歡迎的。

+0

作爲一個方面說明,在OCaml中以大寫字母開始文件名被認爲是不好的做法。 'linkage.cmo'會比'linkage.cmo'更好。 – PatJ

+1

如果你想分析ocaml編譯器,我可以建議你使用「ocp-memprof」。 ocp-memprof的主頁:http://memprof.typerex.org/ – alifirat

回答

4

截至目前,還沒有。

雖然你可以自己動手,但編譯器的源代碼是open,你可以獲取並修改它們以滿足你的需求。

根據您使用的是ocamlc還是ocamlopt,您需要修改driver/compile.mldriver/optcompile.ml以在編譯過程中添加計時器。

幸運的是,這已經爲你做了here。只需編譯選項-dtimings或環境變量OCAMLPARAM=timings=1,_即可。

更容易,你可以下載OPAM Flambda開關:

opam switch install 4.03.0+pr132 
ocamlopt -dtimings myfile.ml 

注:Flambda本身的變化編譯時間(大部分內容輸入後會發生),並將其納入OCaml的編譯器尚未證實。

0

OCaml編譯器在這方面是一個普通的OCaml程序。我會用poorman's profiler進行快速檢查,使用例如pmp腳本。