天天看點

《.NET程式員面試秘笈》----面試題15 .NET程式是如何編譯的

本節書摘來自異步社群《.net程式員面試秘笈》一書中的第1章,面試題15,作者: 張雲翯, 更多章節内容可以通路雲栖社群“異步社群”公衆号檢視。

.net程式員面試秘笈

【考點】clr的知識,中間語言的知識。

【出現頻率】

【解答】

.net的程式可由多種進階語言編寫,如c++、visual basic、 c#、 j# 等,但是最後将會被各自的編譯器編譯為一緻的中間語言(il)。最後由clr提供運作環境,将中間語言編譯為機器碼,供cpu執行,其編譯過程如圖1.26所示。

為了盡量減少中間代碼編譯為機器代碼的性能損失,中間語言采用即時編譯,也被稱為jit編譯。這種編譯方式隻編譯調用的代碼部分,而并非完全編譯程式中所有的代碼,編譯過的部分将存儲在記憶體中,下次執行時不需重複編譯。當退出程式時,已編譯部分的代碼才會被清除。這種政策極大地降低了中間代碼的性能損失,是程式靈活性和性能相權衡的較佳方案。

《.NET程式員面試秘笈》----面試題15 .NET程式是如何編譯的

【分析】

在系統中運作.net程式必須安裝相應版本的.net framework,目前最新版本為4.5。.net程式不是已經編譯過了麼?為什麼還要依賴.net framework呢?這和.net程式的運作機制有關,傳統上程式分為源代碼層和編譯後的本機代碼層(機器碼)。而.net提供了對多種程式設計語言以及多重平台的支援,是以在其中添加了中間代碼層,中間代碼被稱為il或msil。由于多了中間語言代碼,使.net程式有了更好的靈活性,有運作于多個平台的可能性(如linux系統)。

.net framework的核心是clr,即公共語言運作時,clr是.net程式的運作庫環境。中間語言需要在clr中運作并轉換為機器碼,是以.net程式必須依賴.net framework才能運作。以c# 語言為例,c# 編譯器編譯的程式隻是由中間語言構成,無法直接運作,必須由clr執行。

.net這種編譯運作的機制和java、actionscript比較相似,java第一次編譯為位元組碼,而java良好的移植性得益于此。隻要客戶機安裝了java虛拟機(jvm),就可以直接運作java程式(jvm将位元組碼編譯為機器碼)。類似地,actionscript同樣被第一次編譯為位元組碼,并存放于swf檔案中。隻要客戶機安裝了flashplayer,swf即可運作,因為flashplayer含有as虛拟機(avm)。可見,.net的clr和jvm、avm是殊途同歸。

說明:

客戶機應盡量安裝新版本的.net framework。

本節問題主要考察面試者對于.net framework編譯的認識,特别是對于中間語言的了解。.net程式的中間語言(il)也被稱為托管代碼,其優點總結如下所示:

(1)平台無關性。例如mono項目,可以使.net程式運作于windows以外的平台。

(2)jit性能優化。及時編譯需要調用的代碼,盡可能提高程式運作速度。

(3)語言互操作性。支援多種語言編寫程式,并編譯為中間語言。通過這個特性,可以使多種語言編寫的程式互動操作,以提升團隊合作的融洽性。

本文僅用于學習和交流目的,不代表異步社群觀點。非商業轉載請注明作譯者、出處,并保留本文的原始連結。