CLR简介(一)

好家伙是通用语言运行时(CLR),简单来说话:

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定义了

  • 如出一辙模拟支持GC,并含有自己之执行顺序基本操作的指令集(通用中间语言 –
    CLI)的虚拟机,这吗就意味着CLR不待靠指定项目的CPU;
  • 一样效描述程序里声称的素(如类型、值、变量等等)的排头数据,以便编译器在变其它可执行文件时有足够的信来打“外部”调用程序里之功能;
  • 一个标准描述字节应该怎么以文件里布局的文件格式,这样咱们以谈论CLR
    EXE的上,不与某特定的操作系统或电脑硬件绑定;
  • 过程的生命周期语义,即一个CLR EXE引用其它CLR
    EXE的体制,和CLR在运作时找到进程依赖文件之平整;
  • 下CLR内置功能(如垃圾回收、异常及泛型等)的类库,其除了提供如整形、字符串、数组、列表和字典等基本功能意外,还提供了要文件、网络与UI交互等操作系统服务。

大抵编程语言支持

概念、规范及实现这些细节是一个艰巨的天职,这为就算是近似CLR的圆抽象非常少之故。实际上,大部分架空都是吗单个编程语言设计之。例如,Java运行时,Perl解释器或者早期的Visual
Basic运行时供了仿佛的完全抽象。但CLR跟这些先行者不同之处在于其绷多编程语言。可能除了Visual
Basic(因为她应用了COM对象模型),仅以单个编程语言的体会是杀好之,但是一旦和另编程语言互操作时体验就起接触不同了。编程语言中互操作之所以困难,是以这些编程语言就会通过操作系统提供的原语来和“外族”编程语言通信。而操作系统的抽象层次太低阶(如操作系统不提供内存垃圾回收),就不得不动用部分复杂的技巧。通过提供 通用语言运行时,CLR允许编程语言中采用高阶结构(如只是GC的数据结构)通信,大量减轻了互操作的劳动。

是因为运行时以 许多 语言之间共享,这就算表示又多的资源而于支持。为一个编程语言实现好的调试器和属性分析工具要大量的办事,因此只出一对老重点之编程语言才有总体的工具链支持。然而,CLR上实现的编程语言可以共享这些基础架构,实现新的编程语言的工作量吗大大压缩了。也许更着重的凡,所有在CLR上落实之编程语言都可拜 所有 在CLR上落实的类库。庞大且不断提高的(严格调试以及支撑)功能是CLR如此成功的一个重要原因。

大概来讲,CLR是一个以许节存到文件为创建同运行程序的整体规范。虚拟机可以下不同编程语言形容就的类库来运作这些程序。这个虚拟机,还有运行该达到之不断加强之类库,就是咱们说的通用语言运行时(CLR)。

起源文集:.NET框架源码解析