CLR中你想知道的事

CLR是什麼?數組

CLR 公共語言運行時,是一個可由多個語言共同使用的運行環境,核心(內存管理,程序集加載,安全性,異常處理和多線程)安全

Visual Studio是一種編譯器,編譯器也可稱爲語法檢查器和正確代碼的分析器多線程

Visual Studio點擊生成或調試的時候幹了什麼?函數

編譯器會生成一個託管模塊。託管模塊是一個可移植執行體(PE32)文件,若是是64位則是可移植執行體(PE32+)文件spa

Visual Studio爲何能夠智能感知類的方法和參數?線程

託管模塊組成包括,PE32或PE32+頭,CLR 頭,元數據,IL代碼,重點就在元數據上,元數據是一個數據表集合,數據表中描述了模塊中定義了什麼,包括類型和成員,另外一些描述了模塊裏面引用了什麼,包括引用的類型和成員,並且生成的元數據和代碼是綁定到一塊兒的,因此元數據和他的描述的IL代碼就能永遠同步。debug

元數據用途:1.避免對原生C/C++頭和庫文件的需求 2.智能感知方法還有參數 3.代碼驗證,確保類型安全 4.容許對象序列化到內存塊 5.容許垃圾回收期跟蹤對象生存期調試

IL是什麼,能幹什麼?code

IL是一種高級機器語言,IL代碼又被稱爲託管代碼,是Microsoft做者們費盡心思地跟不少編譯器做者們請教以後的產物,能訪問和操做對象類型,並提供指令來建立和初始化對象、調用對象上的虛方法以及直接操做數組元素、還提供了拋出和捕獲異常的指令來實現錯誤處理,對象

編譯成IL代碼以後會再次編譯,最終生成能被CPU識別的機器指令,而後執行。

IL如何執行?

說到執行,首先要提到編譯,IL編譯要用到JIT編譯器,JIT編譯以後的入口函數稱爲JITCompiler,如何編譯獲得JITCompiler函數,請看下面這個代碼:

static void Main(string[] args)
{
       Console.WriteLine("HelloWorld");
}

執行步驟以下:

1.在負責實現類型(Console)的程序集的元數據中查找被調用的方法(WriteLine)

2.從元數據中獲取該方法的IL

3.分配內存塊

4.將IL編譯成本機CPU指令,而後將這些本機代碼存儲到步驟3分配的內存中

5.在Type表中修改與方法對象的條目,使它指向步驟3分配的內存塊

5.跳轉到內存塊中的本機代碼

爲何說C++牛逼?

C++編譯器是獨一無二的,它是惟一容許開發人員同時寫託管和非託管代碼,並生成到同一個模塊中。

PDB文件有什麼用?

Visual Studio當使用debug模式的時候會再Debug文件夾中生成PDB文件,PDB文件能夠幫助調試器查找到局部變量並將IL指令映射到源代碼,進行調試。

託管代碼和非託管代碼的區別?

託管代碼簡單說就是須要通過CLR二次編譯的代碼,非託管代碼就是能夠直接編譯成CPU指令的代碼。

相關文章
相關標籤/搜索