什么是通用语言运行时(CLR),简单来说:程序员
CLR是一个支持多种编程语言及多语言互操做,完整的高级虚拟机。编程
有点拗口,并且不是颇有启发性,但上面的文字是将又大又复杂的CLR的功能归类以便容易理解的第一步。它从一万英尺的高度来帮助咱们理解CLR的设计目标。从这个高度明了CLR以后,咱们能够深刻其各个组件了。数组
每一个程序在运行的时候都有惊人数量的运行时依赖。虽然程序很明显都是由一种特定的编程语言写就,但这只是程序员编写程序多种依据中的一种。每一个有用的程序都须要某些 运行时函数库 以便其能跟电脑的其它资源(如用户输入设备,磁盘文件,网络通讯等)交互。程序也须要转换成计算机硬件能够直接执行的某种格式。这些依赖的数量是如此之多,范围之广,使得编程语言的设计者一般都引用其它标准来规范它们。例如C++编程语言不会规定C++程序的格式,每一个C++编译器都会与特定的硬件架构(如x86架构)关联,与特定的操做系统环境(如Windows,Linux或者Mac OS)关联,这些架构和环境会规定可执行文件的文件格式以及加载的方式。所以,程序员不是在编写一个“C++可执行程序”,而是“Windows X86可执行程序”或“Power PC Mac OS可执行程序”。网络
复用现有的硬件或操做系统标准一般都是好事情,但其使得在现有标准之上抽象出新的规范变得很难。例如,今天的操做系统没有支持垃圾回收的堆。所以也就没法使用现有的标准来支持垃圾回收的接口(如,将字符串传来传去,不须要关注删除它们)。一样,一个典型的可执行文件格式只提供足够运行程序的信息,但不足够编译器将其余可执行文件绑定在一块儿运行。好比说,C++程序通常都使用包含常用功能(如printf)的标准库(在Windows里是msvcrt.dll),但只有这个库是不够的。没有对应的头文件(如,stdio.h),程序员是没法使用这些函数库的。所以,已有的可执行文件格式标准不能同时描述可执行的文件格式,并添加其它一些信息。数据结构
CLR经过定义一个 [很是完整的规范]ecma-spec来描述一个程序从编译、到部署时绑定依赖、到运行整个生命周期的全部信息。所以,除去其余细节,CLR定义了架构
定义、规范和实现这些细节是一个艰巨的任务,这也就是相似CLR的完整抽象很是少的缘由。实际上,大部分抽象都是为单个编程语言设计的。例如,Java运行时,Perl解释器或者早期的Visual Basic运行时提供了相似的完整抽象。但CLR跟这些先行者不一样之处在于其支持多种编程语言。可能除了Visual Basic(由于它采用了COM对象模型),仅使用单个编程语言的体验是很是好的,可是要与其它编程语言互操做时体验就有点差了。编程语言之间互操做之因此困难,是由于这些编程语言仅能经过操做系统提供的原语来与“外族”编程语言通讯。而操做系统的抽象层次过低阶(如操做系统不提供内存垃圾回收),就不得不采用一些复杂的技术。经过提供 通用语言运行时,CLR容许编程语言之间采用高阶结构(如可GC的数据结构)通讯,大量减轻了互操做的麻烦。框架
因为运行时在 许多 语言之间共享,这就意味着更多的资源可被支持。为一个编程语言实现好的调试器和性能分析工具须要大量的工做,所以只有一些很重要的编程语言才有完整的工具链支持。然而,CLR上实现的编程语言能够共享这些基础架构,实现新的编程语言的工做量也大大缩减了。也许更重要的是,全部在CLR上实现的编程语言均可以访问 全部 在CLR上实现的类库。庞大且不断增加的(严格调试和支持)功能是CLR如此成功的一个重要缘由。编程语言
简单来说,CLR是一个将字节存到文件以建立和运行程序的完整规范。虚拟机可使用不一样编程语言写就的类库来运行这些程序。这个虚拟机,还有运行其上的不断增加的类库,就是咱们说的通用语言运行时(CLR)。函数
来自文集:.NET框架源码解析工具