2011-09-27 72 views
2

我已經看到了有關「託管」代碼的含義的幾種解釋,並且一些目標是將託管代碼編譯爲中間語言,JITed和其他人討論GC和內存管理。究竟是哪一種語言能夠管理,還是兩者兼而有之?託管代碼是指JIT還是GC?

由於GC的回答很有意義,因爲內存是託管的(因此「託管代碼」),但是在那裏假設不是具有GC但是本地語言(未編譯爲IL)的語言。 GC和IL代碼是否緊密耦合?

+0

JIT編譯器的存在是一個實現細節(它對運行程序的語義無關緊要,可能未定義的行爲和錯誤在JIT中)。 *技術上講,這同樣適用於將代碼編譯爲字節碼還是編譯爲本地代碼,儘管在實現的生命週期內更改的可能性要小得多,而且對於大多數或所有實現來說,甚至許多語言都是一致的。 – delnan

回答

2

不,我不會說GC和IL緊密耦合。事實上,一個人可以沒有另一個而存在 - 有時情況就是這樣。

IL的主要目的是使其與平臺無關,並允許JIT根據平臺進行非常具體的優化。例如,x86,x64,ARM等.JIT的目的是將該IL轉換爲該體系結構的本地機器代碼,並對其進行正確優化。

由於平臺差異太大,無法針對x86和ARM進行優化。這就是爲什麼每個特定平臺都有一個JIT。 JIT有能力知道它將面臨什麼樣的平臺。作爲代碼作者,你可能不知道。

另一方面,GC是關於內存管理的。有許多垃圾收集器庫用於不能編譯爲中間語言的軟件。以this one爲例,它很小,但可以完成工作。關於這個問題也有很多papers

一個人可能沒有另一個存在,這不僅僅是我們經常看到的。

那麼是什麼讓一個「託管」的語言?對我而言,這意味着有一種涉及某種類型的虛擬機。在.NET的情況下,CLR。它提供了各種服務,如GC,Jit,代碼訪問安全性(CAS)等。

1

http://en.wikipedia.org/wiki/Managed_code

這使得很明顯,其被管理的(由虛擬機下運行)的代碼,而不是存儲。

+0

是的,但CLR是否提供垃圾回收? (我問,因爲我不知道) – riwalk

+0

@stargazer。是的,它確實。但這不是因爲它「被管理」。 –

1

託管代碼表示它由虛擬運行時計算機運行,通常意味着內存管理。當他們說「託管代碼」時,這就是人們的意思。系統資源(如內存分配)可以在其他一些事情中爲您管理。

JIT與它無關。 JIT是一些虛擬運行時間機器的功能,但不是要求。 Visual Basic 6使用運行時而不是JIT - 它是逐行解釋的。 JIT在調用時編譯一個代碼單元。但是,.NET語言將使用實現JIT編譯的.NET運行時。