每一種編程語言,要想執行,就必須要轉換為目標操作系統能夠理解的語言才能執行,這種語言叫做本機代碼(native code)。C#也是一樣的,也要做這樣的轉換,但是它不是一處到位的,在.NET Framework這個平台下,該過程分為兩個階段。
(1)C#代碼編譯為中間語言代碼的階段-----在編譯C#代碼時,並不是立即創建了本地代碼,而是通過C#編譯器(這個編譯器集成在Visual Studio裡面)把代碼編譯為通用中間語言(Common Intermediate Language,CIL)代碼,也就是IL代碼,並將其存儲在一個程序集中。程序集中除了有IL代碼外,還將包括元數據和可選的資源文件:元數據是用來描述代碼中的類型,這種描述針對3個方面:類型定義的描述、類型成員的描述和類型引用成員的描述;可選的資源文件指的是IL代碼中使用的其他數據,如圖片文件等。(PS:在C#中,程序集分為兩種,擴展名為.exe的可執行文件和擴展名為.dll的可供其他程序調用的庫文件。)
(2)中間語言代碼(IL代碼)轉換為本地代碼的階段-----要使代碼能夠在目標操作系統上運行,還需要進一步把CIL代碼轉換為特定CPU的本機代碼,該過程是由即時編譯器(Just-In-Time,JIT)來完成的。
最後就是執行本機代碼了,JIT編譯生成本機代碼之後,編譯好的本機代碼會被存儲在一個緩沖區中緩存,下次調用相同的程序集時,可直接從緩沖區中獲取本機代碼,從而避免了二次驗證和編譯。這樣的使用方式,系統只在首次調用時才會造成一些性能損失(JIT編譯過程),所以C#程序在第一次調用的時候,會明顯感覺慢一些。下面這張圖是我在網上找的,很淺白的說明了代碼的執行過程。