《CLR.via.C#第三版》第一部分讀書筆記(一)

杭偉發表於2014-11-05

     最近開始仔細研讀《CLR.via.C#第三版》這本書。讀pdf文件確實很累。建議有條件的朋友還是買書看吧。

     我的筆記用來記錄我對這本書的理解,簡化下邏輯,對每個部分我覺得是要點的進行歸納總結。特別基礎的東西不會做過多的闡述。

     第一部分講的是CLR基礎。

     首先還是重新說下CLR的概念:“CLR 是一個可由多種程式語言使用的“執行時”。可用任何程式語言來開發程式碼,只要編譯器是面向CLR的就可以了”。這裡要重新解釋下“只要編譯器是面向CLR的就可以了”這句話。初學者一般不認同.net平臺跨語言,或者說所謂的“跨語言”是在微軟推出的範圍內的語言。這個認識其實是錯誤的。任何語言都可以面向CLR來建立自己的編譯器。我們熟知的Iron Ruby、Perl、PHP都有面向CLR的編譯器。圖1-1展示了編譯原始碼檔案的過程。

      

      比較重要的認知是CLR實際不和託管模組一起工作,而是和程式集一起工作。程式集包含了託管模組和資原始檔等其它檔案。

      IL(中間語言)可以使用匯編語言來寫。CLR中的JIT(just in time)也叫即時編譯器,裡面有個函式JITComplier(),此函式的職責是把要執行的方法的IL轉換成本地CPU指令。

      類中方法的呼叫過程:

      一個方法執行的時候總的來說會被呼叫兩次。(這裡暫定方法名為Test())

      第一次呼叫:

      JITCompiler()會把Test()方法的IL程式碼編譯成本地CPU指令(此指令會被儲存到一個動態分配的記憶體塊中),Test()方法在記憶體塊中會通過JITComplier執行一遍(包括查詢方法的IL,驗證方法的IL,編譯,執行)。

      第二次呼叫:

      完全跳過JITCompiler(),Test()方法在記憶體中再執行一遍。

      兩次執行的過程如圖1-4,1-5所示:

      

     

     需要注意的是本地CPU指令是儲存到動態記憶體中的,一旦程式終止,本地CPU指令將會被丟棄。

     Debug版本和Release版本的區別本質上是IL程式碼質量和JIT原生程式碼質量是否經過優化。從效能上考慮,程式部署、釋出,最好是用Release版本。

     這個部分還有程式打包、部署、程式集資訊等內容。這裡就不闡述了。

相關文章