2011-01-06 34 views
7

目前我正在爲F#大學做一個研究。我有一個關於F#交互式控制檯和F#編譯器的問題。F#解釋器(fsi.exe)是否也生成中間語言代碼,如F#編譯器(fsc.exe)所做的那樣?

F#編譯器在編譯F#源時會生成Microsoft中間語言(MSIL)代碼。然後在執行寫入的程序時,由JIT編譯器將其轉換爲機器代碼。

但是,F#解釋器控制檯有什麼作用?它是否還將每行的F#代碼轉換爲MSIL,然後將其轉換爲機器代碼?或者它是否將F#代碼直接轉換爲機器代碼?

如果它先將它轉換爲IL,那麼我認爲可能會有一個IL解釋器,因爲JIT編譯器只編譯完整的程序。不是嗎?

您如何看待F#解釋器如何處理F#代碼並將其轉換?

問候, 馬丁

回答

13

F#編譯器使用IL自己的圖書館AbsIL發出。 AbsIL是另一個被F#吸收的MSR項目。

當編譯爲交互模式時,AbsIL uses命名空間在運行時在內存中發出IL,而JIT在執行代碼時將其依次編譯爲本機代碼。

+0

快速grep的源代碼似乎表明AbsIL不使用System.Reflection.Emit,但直接生成二進制.NET BinaryWriter流的二進制文件。在某些地方,它似乎也使用在bytes.fs中定義的自定義ByterBuffer。我相信這是因爲最初AbsIL必須與OCaml進行交叉編譯,但在編譯器啓動時已經離開了。 – Robert 2011-01-07 12:54:58