计算机基础-------托管代码、非托管代码的理解

简介: 计算机基础-------托管代码、非托管代码的理解

之前没有听说过托管代码和非托管代码,于是在网上搜索了一些,对它有了一个浅显的理解。


所谓托管,就是需要借助中间媒介来完成,而非托管无需借助外物自己就可以完成。所以托管代码就是需要借助其他工具来运行,例如我们学的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混为一谈,两个的运行效率根本不是一个等级的!

目录
相关文章
|
程序员 C语言 Windows
C语言技巧 ----------调试----------程序员必备技能
C语言技巧 ----------调试----------程序员必备技能
|
6月前
|
存储 索引
软件工程概论------文件管理
软件工程概论------文件管理
43 0
|
3月前
|
C语言
C语言------程设设计入门
这篇文章是C语言程序设计的入门教程,涵盖了C程序的实现过程、VC集成开发环境的使用、基本数据类型的使用、格式控制字符的作用,以及通过示例代码演示了如何使用printf()函数输出不同类型的数据。
C语言------程设设计入门
|
6月前
|
vr&ar
编译原理----FIRST集,LARST集,FIRSTVT集,LASTVT集
编译原理----FIRST集,LARST集,FIRSTVT集,LASTVT集
48 1
低级编程语言----恶搞室友
低级编程语言----恶搞室友
|
6月前
|
存储 程序员 C语言
C语言进阶第九课 --------动态内存管理-2
C语言进阶第九课 --------动态内存管理
|
6月前
|
编译器 C语言
C语言进阶第九课 --------动态内存管理-1
C语言进阶第九课 --------动态内存管理
|
6月前
|
存储 编译器 C语言
C语言进阶第十课 --------文件的操作-1
C语言进阶第十课 --------文件的操作
|
6月前
|
存储 C语言
C语言进阶第十课 --------文件的操作-2
C语言进阶第十课 --------文件的操作
|
存储 缓存 编译器
初识C语言----完结篇(一)
初识C语言----完结篇(一)
76 0