時隔這麼長時間,今天重新讀了C#進階編程,對於之前模糊的東西,總算有點清晰了,可能跟最近拜讀園子裡一些大牛的文章有關吧。
我再一次意識到,CLR在整個.net體繫結構中的位置:整個.net framework的核心。簡單的來說,我們所編寫的所有原始碼(包括.net支援的所有語言),最終都要被編譯成MSIL(中繼語言),而後CLR則採用JIT的方式把IL編譯成平台目標代碼。
那麼為什麼要採用這種中繼語言的方式呢?
1.可以使平台無關:因為不管那種語言編寫的源碼(vb,c#,C++),都會編譯成IL,而後CLR會根據各自平台編譯目標代碼,這樣就實現了平台無關。但是目前好像還沒能實現(只能在window環境下運行)。
2.JIT編譯提高效能。所謂JIT,即只編譯應用程式調用的那部分代碼,而沒有用到的就不去編譯,從而減少全部編譯造成的效能損失。另外,凡是編譯過的代碼都會暫時儲存起來,在退去應用程式之前如果再次調用,就可以減少編譯時間。
3.實現語言互操作:同樣道理,因為不管什麼語言,都要編譯成統一的IL,這樣才有了互操作的可能。這裡不得不提到CTS(一般型別系統),也就是說,不管哪種.net程式設計語言,他們的資料類型都能在CTS中得到映射(找到對應的資料類型),而CTS恰恰定義了可以在中繼語言中使用的資料類型。
中繼語言的一個特點是它是基於強型別的,所謂的強型別,即每個變數在定義的時候必須明確其資料類型(這和VB不同,VB是弱類型化的語言),這樣做也有幾個好處:
1.安全:如果定義有誤,也是編譯時間錯誤,便於及時更正。
2.記憶體配置和記憶體回收(GC):定義明確的資料類型,記憶體配置的時候就可以明確的根據資料類型分配對應的記憶體大小;同時一旦GC檢查到某對象不再被引用要回收時,能夠釋放對應的記憶體空間。
對於GC,還有幾點需要注意:
1.GC只對於參考型別的資料有效,而値類型的變數在超出其範圍後自動釋放所佔記憶體。
2.GC的運行是不確定的,什麼時候調用它有CLR決定。當然我們手動調用運行它。
裡面還涉及到兩個重要的概念:應用程式定義域和COm組件,還不是太明白,等搞清楚了補上~