簡體   English   中英

為什么C#不直接編譯到機器代碼?

[英]Why doesn't C# compile directly to machine code?

CIL是一種面向對象的匯編語言,完全基於堆棧。 它的字節碼被翻譯成本機代碼,或者 - 最常見的 - 由虛擬機執行。

為什么我們需要CIL? 是不是可以將C#轉換為本機代碼而不是CIL? 如果所有.Net語言都編譯成CIL,為什么不使用C#而不是IL? CIL比C#或VB更具表現力嗎?

問題更為籠統: 為什么我們需要中間語言 為什么許多現代高級語言編譯成中間形式,然后解釋/ JIT到本機代碼?

首先,請注意,不僅.NET使用自己的中間語言。 Java有一個以及許多其他語言/平台。

有幾個原因支持這種方法。 最重要的是中間語言抽象運行時環境的體系結構 不依賴於任何特定的體系結構,而是使用一些抽象(例如,在CIL中沒有寄存器,盡管物理機器有寄存器,在CIL中有局部變量通常被JIT到物理寄存器)。

抽象意味着更容易推理安全性性能 例如,他們有一個正式的定理,即CIL是類型安全的,由J. Kennedy和D. Syme證實。 此外,抽象中間形式可能比平台本機代碼更緊湊。 另一個好處是實際執行可以使用有關當前系統的信息,例如,在32位與64位環境中執行的完全相同的CIL可以被JIT到不同的本機代碼,這反映了64位寄存器的可用性。

http://en.wikipedia.org/wiki/P-code_machine

C#不是中級語言的好選擇。 雖然CIL和C#都是Turing-complete ,這意味着任何其他編程語言都可以編譯成C#和CIL,但C# 太過抽象 ,太高級。 因此,將一些非對象語言編譯成C#(函數式語言,聲明性語言)可能需要大量的C#代碼,並且與所有高級語言的目標相同,抽象但仍然相比的情況下,實際執行會更慢。非常低級的中間語言,可以有效地JIT到本機代碼。

這就是為什么CIL包含C#中不存在的功能,反之亦然。 例如,CIL支持方法指針尾調用,而C#不需要兩者 - 但這樣一些函數式語言可以以更有效的方式進行轉換。 另一方面,C#具有CIL中不存在的屬性概念 - 這是因為屬性可以被視為語法糖 ,不會引入任何表達性,而是在語言中引入某種方便性

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM