之前没有听说过托管代码和非托管代码,于是在网上搜索了一些,对它有了一个浅显的理解。
所谓托管,就是需要借助中间媒介来完成,而非托管无需借助外物自己就可以完成。所以托管代码就是需要借助其他工具来运行,例如我们学的java需要借助JDK来完成运行;非托管代码,例如我们Windows系统下的汇编语言和C语言,可以直接运行。
通过网上查阅,发现千篇一律,就找了一篇博客参考一下,下面是我截取的有直接理解作用的部分内容:
托管代码:
托管代码是中间语言,他主要的作用是在公共语言运行库执行代码前去编译源代码,也就是说托管代码充当着翻译的作用。
托管代码的的执行过程:
1.选择编译器。
为获得公共语言运行时提供的优点,必须使用一个或多个针对运行时的语言编译器。
2.将代码编译为 MSIL。
编译将源代码翻译为 Microsoft 中间语言 (MSIL) 并生成所需的元数据。
3.将 MSIL 编译为本机代码。
在执行时,实时 (JIT) 编译器将 MSIL 翻译为本机代码。在此编译过程中,代码必须通过验证过程,该过程检查 MSIL 和元数据以查看是否可以将代码确定为类型安全。
非托管代码:
托管代码直接编译成目标计算机的机械码,这些代码只能运行在编译出它们的计算机上,或者是其它相同处理器或者几乎一样处理器的计算机上。非托管代码不能享受一些运行库所提供的服务,例如安全和内存管理等。如果非托管代码需要进行内存管理等服务,就必须显式地调用操作系统的接口,通常来说,它们会调用Windows SDK所提供的API来实现。就最近的情况来看,非托管程序会通过COM接口来获取操作系统服务。
区别:
1、托管代码是一种中间语言,运行在CLR上;
非托管代码被编译为机器码,运行在机器上。
2、托管代码独立于平台和语言,能更好的实现不同语言平台之间的兼容;
非托管代码依赖于平台和语言。
3、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不需要自己完成这些操作;
非托管代码需要自己提供安全检测、垃圾回收等操作。
托管类型是可以被垃圾回收器所回收的。他们必须要用关键字new来创建,永远都不会在栈中出现。
托管代码与非托管代码的性能比较:
基本上每个人都知道的是,所有.Net语言都将被编译成为一个叫做IL汇编的中间语言。但是计算机是如何执行这个中间代码的,却是很多人不知道,甚至理解错误了的。 JIT是.NET程序运行的重要部件之一,全称是即时编译器。很多人(绝对不是少数,问了很多c++程序员,10个有9个这种想法)都以为JIT其实就是跟Java VM差不多的东西,是一个Interpreter,在运行时读取IL汇编代码,然后模拟成x86代码(也就是俗称的虚拟机)。但是事实上,.NET使用的是更为高级的技术。 .Net程序被加载入内存以后,当某段IL代码被第一次运行的时候,JIT编译器就会将这段IL代码,全部编译成本地代码,然后再执行。这也就是为什么.NET程序第一次运行都启动很慢的原因! 随.NET库,微软还附带了一个工具,可以事先将.NET程序所有的IL代码都编译成本地代码并保存在缓存区中,这样一来,这个程序就跟c++编译的一模一样了,没有任何区别,运行时也可以脱离JIT了(这里不要混淆了,这里不是说可以脱离.NET库,而是说不需要在进行即时编译这个过程了)。所以,请不要将.NET和Java混为一谈,两个的运行效率根本不是一个等级的!