CLR英文全称Common Language Runtime,即公共语言运行时。
乍一看到这个概念确实不明白,什么是语言运行时?
简单来说,就是一个程序运行所需要的环境,包括各种资源、各种操作等等。
通常来说,不同语言、不同操作系统所需要的运行时环境都不一样。举个例子,Windows上的可执行程序都被包装成了.exe格式,而这种.exe格式文件提供了一个程序从加载到运行所需要的所有资源和环境。
而CLR提供了:
1、一个支持GC的虚拟机,该虚拟机有自己的一套指令集,即CIL(公共中间语言,COmmon Intermediate Language)。高级语言最终会转化成CIL,
2、一种丰富的元数据表示,用来描述数据类型、字段、方法等。通过这些统一的描述方法来生成对应的程序。
3、一种文件格式,一种专属的不于操作系统和硬件绑定的格式,即跨平台。
4、一套类库,提供了垃圾回收、异常、泛型等基本功能,提供了字符串、数组、列表、字典等数据结构,提供了文件、网络、交互等操作系统功能。
5、一系列规则,定制了在运行时如果查找引用其他文件、生命周期等一系列规则。
下面这张图就非常好的表示了高级语言、CIL和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极大地简化了交互的复杂性。
但是这么多种各式各样的语言最终都要编译成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