2016-07-15 230 views
5

我試圖讓我的思想圍繞託管與非託管代碼的概念。糾正我,如果我錯了,但託管代碼是任何被編譯爲字節碼的東西,而非託管代碼被編譯成機器代碼。託管代碼與非託管代碼

這是正確的嗎?

+0

這是關於垃圾收集的一切,使得託管代碼與衆不同的地方在於GC可以找回代碼使用的對象引用。即時編譯器在此方案中起着非常關鍵的作用,除了將MSIL編譯爲機器代碼(就像C編譯器用C代碼所做的那樣),它還*生成一個表,告訴GC在哪裏查找對象引用。該表是不同的,非託管代碼不能提供該表。 –

回答

4

從annakata的回答是:(!希望)

託管代碼不會被編譯成機器碼,而是這是一臺機器上的解釋和執行一些 服務,因此內運行的中間語言 安全的框架,處理危險的東西,如內存和 線程爲你。在現代用法中,這通常意味着.NET,但並不是必須的。

非託管代碼被編譯爲機器代碼,因此直接由OS執行。因此它有能力去做 破壞/強大的事情託管代碼沒有。這是一切 如何用來工作,所以通常它與舊的東西一樣的.dll

現在,什麼是引擎蓋下回事關聯? 託管與非託管是全部關於內存

在託管代碼中,代碼本身不直接處理內存。它向代表代碼的運行時提供指令。這樣,可以阻止不安全或非法操作,並且代碼在半沙箱中運行。託管語言可以並經常具有非託管代碼 - 這就是計算的本質。

可視化內存就像一個巨大的停車場。託管語言和非託管語言之間的區別如下所示:

在託管語言中,您走向代理並解釋您希望停放10輛汽車。你不知道他們停在哪裏其中,但你知道,僕人會很樂意隨時爲你找回他們。你也不會去決定他們停在哪裏 - 你只需告訴代客他們需要停放。

在非託管語言中,選擇這些點是您的工作。你可以開車進入其他車輛,停在殘疾人的地方,無論 - 這給你更好的表現(你不必經常中轉指示給僕人)但是你也可以犯很多愚蠢/危險的錯誤。

+0

能不能有一個託管語言編譯爲機器碼?我認爲這個區別完全是關於有沒有垃圾收集器。一個人暗示另一個人嗎? – JamesFaix

+0

如果編譯爲機器代碼,那麼添加垃圾收集器等功能的唯一方法是在編譯期間將大量的程序集發佈到代碼中。也就是說,衆所周知的「代客」將被轉換爲程序集時插入到其他所有代碼行中。 – Ares

+0

老派的LISP減速機呢?(不是說你*應該*知道答案,或者這些日子真的很重要。) – JamesFaix