.NET——CLR的環境

CLR2部分組成,即可執行文件和CLR的虛擬引擎(VEE)。

CLRVEE負責將中間語言轉換成機器碼,並負責執行,同時提供所需要的各種支持服務。類裝載器(Class Loader負責將.NET類裝載進內存併爲它的執行做準備。在.NET程序執行的任何時刻,如果想調入一個新類,都需要類加載器來完成。類型檢測器主要是在程序運行時刻來驗證代碼是否類型安全,提供運行時安全檢查,是.NET平臺在可靠性方面的較大該進。JIT編譯器將對每個已經通過類型安全驗證的方法進行編譯,將其轉換爲託管本地代碼。JIT只在方法的第一次調用的時候進行,已編譯的本地代碼會在內存中保存,但在下一次開機,執行進程或組件時,JIT會再次工作。JIT在編譯時生成管理器定位和託管數據,代碼管理器用此數據控制代碼的執行,包括代碼的異常處理、安全檢查、調用支持、互操作支持、無用資源回收等。如下圖所示:

 

 

 

 


 

 

 

 

 

 

 

 

 

 

 

 

.NET架構的思想基礎依然是虛擬機原理。但.NET架構最重要的事實之一是它沒有像JAVA那樣的通用虛擬機技術,運行在CLR上的軟件不是解釋執行的,而是被完全編譯的,並且像C++程序編譯代碼一樣運行在機器一級。儘管.NET使用了中間語言,但.NET使用的是多階段編譯技術,最初編譯爲可移植的公用中間語言,最好在執行程序時JIT編譯到最終的可執行格式。.NET編譯架構總圖如下:

 

上圖應該是一個程序員心中的.NET編譯器框架圖,雖然複雜但它體現很多優點:

1        所有語言有一個共同的中間層,它們在該層上完全共享中間格式。當用某一種語言編寫的某一段代碼被編譯成IL時,就把它與它的全部描述一起打包,把類、接口、屬性、方法做爲元數據格式存放。這就是.NET支持的語言能夠完全集成,任何語言編寫的模塊混合能夠創建單個應用程序的原因。

2         放棄瞭解釋執行的方法。CLR在執行一個已經被轉化成IL的程序時,它使用的是JITIL編譯爲本地代碼。JIT是非常快速有效的,它甚至可以做到不編譯中間代碼未使用的部分,以介紹編譯是時間。爲了能節省編譯的時間,CLRhaunted提供了預編譯器(PRE JIT),當程序不需要移植時,PRE JITIL編譯爲永久本地代碼。此外CLR還提供了一個ECONOJIT,它是一個壓縮移動編譯器,速度非常快,它編譯高度優化的代碼OPTILOPTILIL的一個高度優化的子集,專門爲一些沒有大量內存或大量計算能力的系統使用)

3         應用在PDA、手持設備、電話等小型設備上。

我們知道,CLR的環境的根本任務是管理和執行.NET代碼,程序代碼的執行過程,是每個程序員最關心的問題,同時對他們從本質上理解CLR環境也有很大的幫助。.NET程序執行過程可以簡述爲:首先由類裝載器找到並裝入對象,將其激活;檢測器中驗證程序對其進行類型驗證;JIT將編譯並轉換爲本地代碼;同時可以動態對目標機器進行代碼優化;執行代碼,同時提供所需的其他服務(如安全檢查、異常處理、垃圾回收等)。如下圖:

 

發佈了209 篇原創文章 · 獲贊 6 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章