前言
工作这么久了,对一些基本概念,仍然是比较模糊,或者说是没有去深究,总觉得内心不安分,没底。现决定去梳理一下,只求能做个明明白白的程序员,在写出的程序性能上能有些个更好的把握。
什么是CLR,托管,非托管.
参考链接:http://baike.baidu.com/view/1736538.htm.
CLR叫做公共语言运行时(Common Language Runtime)。它是所有.NET应用程序运行时环境,是所有.NET应用程序都使用的编程基础.
CLR也可以看作一个在执行时管理代码的代理,管理代码是CLR的基本原则,能够被管理的代码称为托管代码,反之称为非托管代码。
CLR包含两个组成部分,CLS(公共语言规范)和CTS(通用类型系统)。下面我们通过理解.NET的编程技术来具体了解这两个组件的功能。
1. CTS
C#和VB.NET都是公共语言运行时的托管代码,它们的语法和数据类型各不相同。CLR是如何对这两种不同的语言进行托管的呢?通用类型系统(Common Type System)用于解决不同语言的数据类型不同的问题,如C#中的整型是int,而VB.NET中是Integer,通过CTS我们把它们两个编译成通用的类型Int32。所有的.NET语言共享这一类型系统,在它们之间实现无缝互操作。
2. CLS
编程语言的区别不仅仅在于类型,语法或者说语言规范也都有很大的区别。因此.NET通过定义公共语言规范(Common Language Specification),限制了由这些不同点引发的互操作性问题。CLS是一种最低的语言的标准,制定了一种以.NET平台为目标的语言所必须支持的最小特征,以及该语言与其他.NET语言之间实现互操作性所需要的完备特征。凡是遵守这个标准的语言在.NET框架下都可以实现互相调用。例如,在C#中命名是区分大小写的,而VB.NET不区分大小写,这样CLS就规定,编译后的中间代码必须除了大小写之外有其他的不同之处。
3. .NET编译技术
为了实现跨语言开发和跨平台的战略目标,.NET所有编写的应用都不是编译为本地代码,而是编译成微软中间代码MSIL(Microsoft Intermediate Language)。它将由JIT(Just In Time)编译器转换成机器代码。C#和VB.NET代码通过它们各自的编译器编译成MSIL,MSIL遵守通用的语法,CPU不需要了解它,再通过JIT编译器编译成相应的平台专用代码,这里所说的平台是指我们的操作系统。这种编译方式实现了代码托管,还能够提高程序的运行效率。
Net Framework 是由彼此独立又相关的两部分组成:CLR 和 类库, CLR是它为我们提供的服务,类库是它实现的功能. .NET的大部分特性----垃圾收集,版本控制,线程管理等,都使用了CLR提供的服务 。当你为.NET Framework编译源代码的时候,得到的目标代码不是CPU能识别的机器指令,而是一种叫做"微软中间语言(MSIL,或简称为IL的代码)"的新语言.CLR提供了一个实时编译器,用来把IL代码编译为本机机器代码.这样一来,CLR能够使代码变得可移植,因为.NET应用程序的源代码必须被编译为IL代码,这些IL代码可以运行在任何提供CLR服务的平台上.从CLR的角度来看,所有的语言都是平等的,只要有一个能生成IL代码的编译器就行,这就确保了各种语言的互操作性.
为CLR而编写以及使用CLR服务的代码叫"托管代码",而那些未使用CLR服务的代码(也就是你多年以来一直编写的代码)叫"非托管代码". 事实上,代码管理的概念是运行库的基本原则。以运行库为目标的代码称为托管代码,而不以运行库为目标的代码称为非托管代码。