CLR簡介
什麼是CLR
CLR英文全稱Common Language Runtime,即公共語言運作時。
乍一看到這個概念确實不明白,什麼是語言運作時?
簡單來說,就是一個程式運作所需要的環境,包括各種資源、各種操作等等。
通常來說,不同語言、不同作業系統所需要的運作時環境都不一樣。舉個例子,Windows上的可執行程式都被包裝成了.exe格式,而這種.exe格式檔案提供了一個程式從加載到運作所需要的所有資源和環境。
而CLR提供了:
1、一個支援GC的虛拟機,該虛拟機有自己的一套指令集,即CIL(公共中間語言,COmmon Intermediate Language)。進階語言最終會轉化成CIL,
2、一種豐富的中繼資料表示,用來描述資料類型、字段、方法等。通過這些統一的描述方法來生成對應的程式。
3、一種檔案格式,一種專屬的不于作業系統和硬體綁定的格式,即跨平台。
4、一套類庫,提供了垃圾回收、異常、泛型等基本功能,提供了字元串、數組、清單、字典等資料結構,提供了檔案、網絡、互動等作業系統功能。
5、一系列規則,定制了在運作時如果查找引用其他檔案、生命周期等一系列規則。
關系
下面這張圖就非常好的表示了進階語言、CIL和CLR之間的關系:

CLR的優勢
CLR最大的優勢就在于跨語言跨平台支援。目前微軟已經為多種語言開發旅了基于CLR的編譯器,包括C++、C#、Visual Basic、F#、Iron Python、 Iron Ruby和IL。還有一些大學、公司和機構為一些語言也開發了基于CLR的編譯器,包括da、APL、Caml、COBOL、Eiffel、Forth、Fortran、Haskell、Lexicon、LISP、LOGO、Lua、Mercury、ML、Mondrian、Oberon、Pascal、Perl、PHP、Prolog、RPG、Scheme、Smaltak、Tcl/Tk等。
CLR為不同的程式設計語言提供了統一的運作平台,對于開發者來說,他們無需考慮平台運作問題,無論使用什麼語言開發,最終都會編譯成IL,供CLR運作。對于CLR來說,它并不知道也無需知道IL是從什麼語言編譯過來的。
CLR的主要目标就是為了讓程式設計更簡單,讓開發者專注于直接需求。正是因為這樣的優勢,CLR極大地簡化了互動的複雜性。
什麼是CLS
但是這麼多種各式各樣的語言最終都要編譯成IL,肯定需要一種規範,否則那不得起飛。
CLS就是用來規範語言的。CLS全稱Common Language Specification,即公共語言規範。也就是說所有被CLR支援的進階語言都需要最少支援CLS所規定的功能集。隻要進階語言最少支援了CLS之後,其它想這麼花裡胡哨就這麼花裡胡哨。
垃圾回收和托管代碼
CLR提供垃圾回收功能,具體垃圾回收算法自行查閱相關文章。
所謂托管代碼,即可以通過CLR的GC來釋放所有資源的代碼,開發者無需過度關注資源的釋放。其實可以從字面上了解,托管代碼委托給CLR進行管理,開發者不管。而至于非托管代碼,比如作業系統代碼、C#中的Socket、Stream等,這些代碼無法通過CLR的CG完全釋放占用的資源。一般來說,非托管的功能都被包裝過了,比如當我們通路檔案的時候,肯定不會直接使用作業系統的CreateFile函數,而是使用System.IO.File類。讓使用者直接使用的非托管功能确實非常少見。
記憶體安全和類型安全
由于CLR提供了垃圾收集,随之帶來的一個特性就是記憶體安全。所謂記憶體安全,即程式隻通路已申請的記憶體。這也就意味着,不會存在任何野指針。
GC是保證記憶體安全的必要條件,但不夠充分。因為雖然GC保證了記憶體的及時釋放和回收(及時檢查記憶體釋放有效,防止通路無效記憶體),但是無法禁止程式越界通路數組或是一些對象成員。
那麼如何解決這個問題,保證記憶體安全呢?接下來就要說到類型安全。
所謂類型安全,即每一塊申請的記憶體都與一種類型相關聯,需要保證被标記了類型的這些記憶體,隻能進行這些類型允許的操作。
進階語言支援
CLR還支援非常多的進階語言特性和功能,比如面對對象、裝箱拆箱、泛型、反射、異常、多線程等。
小結
VM和LR其實比較類似,有人說LR的建立就是為了對标VM。不管是不是,總之至少目前知道了CLR是個什麼東西。如果想深入了解CLR推薦書籍《CLR via C#》。
參考
https://docs.microsoft.com/en-us/dotnet/standard/clr?redirectedfrom=MSDN
https://zhuanlan.zhihu.com/p/68158037
https://zhuanlan.zhihu.com/p/20794115