.Net FrameWork框架
比如:我们要做一道道精美的菜,厨房相当于我们的.Net平台,而柴米油盐酱醋茶、做饭的原料,做饭的工具等等就是我们的.Net FrameWork框架,.Net FrameWork框架是包含在.Net平台的
再比如: .Net平台——>中国移动互联网平台
我们的手机想要上网,发短信,打电话等等,想要实现,就要基于中国移动互联网平台,我们在这个平台下,可以自由的使用手机的各个功能
中国移动互联网平台它要正常的运行离不开在全世界放的信号塔,这个信号塔,提供了一个稳定的环境来保证我们中国移动互联网平台能够正常的运转,这个信号塔就类似我们的.Net FrameWork框架
总结:.Net FrameWork框架是.Net平台中不可缺少的一部分,它提供了一个稳定的运行环境来保证我们基于.Net平台开发的各种应用能够正常的运转。它里面就包含了(CLR, .Net类库)
CLR、CTS、CLS、IL、JIT这堆名词究竟是啥
什么是CLR?
CLR,公共语言运行时(Common Language Runtime)是一个由多种语言使用的“运行时”。他的核心功能包括(内存管理、程序集加载、安全性、异常处理和线程同步),能够被面向CLR的全部语言使用。这里的“运行时”,就是一个运行时环境,就像JAVA虚拟机同样。哦,错了,确切的说是JRE(Java Runtime Enviromental)
什么是CTS?
规范.NET中数据的类型。
CLR是彻底围绕类型展开的,经过类型,经过一种编程语言写的代码能够与另外一种语言写的代码沟通。因此Microsoft制定了一个正式的规范,“通用类型系统”(Common Type System,CTS),它描述了类型的定义和行为。上面已经提到,Microsoft已经将CTS和,NET Framework的其余组件 -- 包括(文件格式、元数字、中间语言及对底层平台的)提交给ECMA完成标准化工做,最终造成的标准称为“公共语言基础结构”(Common Language Infrastructure)。
什么是CLS?
描述多语言之间进行交互的语言规范,.NET系统包括的语言有C#、C++、VB、J#,它们都遵照通用语言规范。
CLR中集成了多种语言,一种语言中能够调用另外一种语言建立的对象。为了实现这一目的,微软定义了一个公共语言规范(Common Language Specification)。它详细定义了一个最小的功能集。任何编译器若是想生成类型兼容于其余“符合CLS,面向CLR语言”生成的组件,那么必需要支持这个最小功能集。
什么是IL?
中间语言
IL是与CPU无关的机器语言,比大多数的CPU机器语言都要高级。能访问操做对象类型、建立及初始化对象、调用对象上的虚方法,直接操做数组元素,甚至能抛出和捕捉异常处理,能够说是一种面向对象的机器语言。CRL之所以不关心语言,是因为每种语言的编译器最终将语言编译成了统一的中间语言(IL),正是由于IL的存在,.net框架才实现了所谓的跨语言
什么是JIT?
just in time, 即时编译。在CLR中,把IL转换成机器代码的工作交给了JIT编译器。即时编译只在方法第一次被调用时发生。
CLR执行托管模块,必需要将IL代码编译成本地CPU指令。这个事情由JIT(just in time)来执行。IL语言本身并不能直接被CPU执行,它需要被CLR的JIT编辑器转换成本机CPU指令,进而最终将程序代码运行起来
C#/.NET编译原理和跨平台特性
任何编程语言要被计算机理解,都需要转化成机器码才行,而转化的过程分为两种主要的形式,即编译和解释。
编译(compile)是将一种语言转换为另一种语言的动作,而一般来说,"另一种语言”通常是机器码(machine code/native code),即全部由 0 和 1 组成的语言,或者某种公共语言,当然机器码可以看作所有语言的目标公共语言。
使用编译器读入一 个文件,将会产出一个由目标语言写成的另一个文件,例如,C# 编译器会产出扩展名为 exe 或 dll 的文件,目标语言是 IL。
而相对的,解释(interpret)虽然也会将代码翻译为机器码,但是,却不会产生目标文件。因此,每次运行解释型语言时,都需要重新进行解释。
不太准确地讲,编译可以类比为做好一桌菜才开吃,而解释可以类比为吃火锅,边涮边吃。
.NET 框架语言是通过两步编译变成机器码的,如下图所示。
第一步编译使用 .NET 自带的编译器(例如 C# 会使用 csc.exe)并生成 IL 语言,它是一个基于栈的、面向对象的高级语言。
显然,高级语言是无法被机器直接执行的,在运行时(runtime), CLR 使用 JIT 来将 IL 转换为机器码,所以,CLR 是 .NET Framework 最重要的组件,没有之一。
在第二步将 IL 或字节码转化为机器码时,会使用对应机器的解释器来执行。
在解释器执行时,会采用即时编译的形式(一句句编译源代码,但是会将翻译过的代码缓存起来以降低性能损耗),因此,它的性能比普通的解释型语言(没有缓存功能)要快。
不过,运行完毕,程序退出之后,缓存的内容就消失了,每次运行时都需要重新编译。
跨平台最常见和最令人熟悉的定义是“一次编译,到处运行”。
这其中,一次编译指的就是第一步编译(转化为中间语言)。
拿到 IL 之后, 通过在特定平台的运行时程序(CLR 和 JRE),解释和编译 IL (即时编译 JIT)为机器码来执行。
而这么做的好处则是,仅需要较少的编译器就可以完成跨平台功能。