重读C#高级编程之.net体系结构
时隔这么长时间,今天重新读了C#高级编程,对于之前模糊的东西,总算有点清晰了,可能跟最近拜读园子里一些大牛的文章有关吧。
我再一次意识到,CLR在整个.net体系结构中的位置:整个.net framework的核心。简单的来说,我们所编写的所有源代码(包括.net支持的所有语言),最终都要被编译成MSIL(中间语言),而后CLR则采用JIT的方式把IL编译成平台目标代码。
那么为什么要采用这种中间语言的方式呢?
1.可以使平台无关:因为不管那种语言编写的源码(vb,c#,C++),都会编译成IL,而后CLR会根据各自平台编译目标代码,这样就实现了平台无关。但是目前好像还没能实现(只能在window环境下运行)。
2.JIT编译提高性能。所谓JIT,即只编译应用程序调用的那部分代码,而没有用到的就不去编译,从而减少全部编译造成的性能损失。另外,凡是编译过的代码都会暂时存储起来,在退去应用程序之前如果再次调用,就可以减少编译时间。
3.实现语言互操作:同样道理,因为不管什么语言,都要编译成统一的IL,这样才有了互操作的可能。这里不得不提到CTS(通用类型系统),也就是说,不管哪种.net编程语言,他们的数据类型都能在CTS中得到映射(找到对应的数据类型),而CTS恰恰定义了可以在中间语言中使用的数据类型。
中间语言的一个特点是它是基于强类型的,所谓的强类型,即每个变量在定义的时候必须明确其数据类型(这和VB不同,VB是弱类型化的语言),这样做也有几个好处:
1.安全:如果定义有误,也是编译时错误,便于及时更正。
2.内存分配和垃圾回收(GC):定义明确的数据类型,内存分配的时候就可以明确的根据数据类型分配对应的内存大小;同时一旦GC检查到某对象不再被引用要回收时,能够释放对应的内存空间。
对于GC,还有几点需要注意:
1.GC只对于引用类型的数据有效,而値类型的变量在超出其作用域后自动释放所占内存。
2.GC的运行是不确定的,什么时候调用它有CLR决定。当然我们手动调用运行它。
里面还涉及到两个重要的概念:应用程序域和COm组件,还不是太明白,等搞清楚了补上~
我再一次意识到,CLR在整个.net体系结构中的位置:整个.net framework的核心。简单的来说,我们所编写的所有源代码(包括.net支持的所有语言),最终都要被编译成MSIL(中间语言),而后CLR则采用JIT的方式把IL编译成平台目标代码。
那么为什么要采用这种中间语言的方式呢?
1.可以使平台无关:因为不管那种语言编写的源码(vb,c#,C++),都会编译成IL,而后CLR会根据各自平台编译目标代码,这样就实现了平台无关。但是目前好像还没能实现(只能在window环境下运行)。
2.JIT编译提高性能。所谓JIT,即只编译应用程序调用的那部分代码,而没有用到的就不去编译,从而减少全部编译造成的性能损失。另外,凡是编译过的代码都会暂时存储起来,在退去应用程序之前如果再次调用,就可以减少编译时间。
3.实现语言互操作:同样道理,因为不管什么语言,都要编译成统一的IL,这样才有了互操作的可能。这里不得不提到CTS(通用类型系统),也就是说,不管哪种.net编程语言,他们的数据类型都能在CTS中得到映射(找到对应的数据类型),而CTS恰恰定义了可以在中间语言中使用的数据类型。
中间语言的一个特点是它是基于强类型的,所谓的强类型,即每个变量在定义的时候必须明确其数据类型(这和VB不同,VB是弱类型化的语言),这样做也有几个好处:
1.安全:如果定义有误,也是编译时错误,便于及时更正。
2.内存分配和垃圾回收(GC):定义明确的数据类型,内存分配的时候就可以明确的根据数据类型分配对应的内存大小;同时一旦GC检查到某对象不再被引用要回收时,能够释放对应的内存空间。
对于GC,还有几点需要注意:
1.GC只对于引用类型的数据有效,而値类型的变量在超出其作用域后自动释放所占内存。
2.GC的运行是不确定的,什么时候调用它有CLR决定。当然我们手动调用运行它。
里面还涉及到两个重要的概念:应用程序域和COm组件,还不是太明白,等搞清楚了补上~