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指令的代碼。