C#基础知识之托管代码和非托管代码

什么是托管代码(managed code)?c++

  托管代码(Managed Code)就是中间语言(IL)代码,在公共语言运行库(CLR)中运行。编译器把代码编译成中间语言,当方法被调用时,CLR把具体的方法编译成适合本地计算机运行的机器码,而且将编译好的机器码缓存起来,以备下次调用使用。随着程序集的运行,CLR提供各类服务:内存管理,安全管理,线程管理,垃圾回收,类型检查等等。编程

  托管代码是一microsoft的中间语言(IL),他主要的做用是在.NET FRAMEWORK的公共语言运行库(CLR)执行代码前去编译源代码,也就是说托管代码充当着翻译的做用,源代码在运行时分为两个阶段:      缓存

1.源代码编译为托管代码,(因此源代码能够有不少种,如VB,C#,J#)      安全

2.托管代码编译为microsoft的平台专用语言。服务器

  编译器把代码编译成中间语言(IL),而不是能直接在你的电脑上运行的机器码。中间语言被封装在一个叫程序集(assembly)的文件中,程序集中包含了描述你所建立的类,方法和属性(例如安全需求)的全部元数据。你能够拷贝这个程序集到另外一台服务器上部署它。app

  托管代码在公共语言运行库(CLR)中运行。这个运行库给你的运行代码提供各类各样的服务,一般来讲,他会加载和验证程序集,以此来保证中间语言的正确性。当某些方法被调用的时候,运行库把具体的方法编译成适合本地计算机运行的机械码,而后会把编译好的机械码缓存起来,以备下次调用。(这就是即时编译)随着程序集的运行,运行库会持续地提供各类服务,例如自动垃圾回收、运行库类型检查和安全支持等。这些服务帮助提供独立于平台和语言的、统一的托管代码应用程序行为。编程语言

  Visual Basic .NET和C#只能产生托管代码。若是你用这类语言写程序,那么所产生的代码就是托管代码。若是你愿意,Visual C++ .NET能够生成托管代码。当你建立一个项目的时候,选择名字是以.Managed开头的项目类型。例如.Managed C++ application。工具

什么是非托管代码(unmanaged code)?  性能

  非托管代码,直接编译成目标计算机码,在公共语言运行库环境的外部,由操做系统直接执行的代码,代码必须本身提供垃圾回收,类型检查,安全支持等服务。如须要内存管理等服务,必须显示调用操做系统的接口,一般调用Windows SDK所提供的API来实现内存管理。优化

  当项目选择名字以MFC,ATL,Win32开头的项目类型,那么这个项目所产生的就是非托管程序。

  非托管代码就是在Visual Studio .NET 2002发布以前所建立的代码。例如Visual Basic 6, Visual C++ 6, 最糟糕的是,连那些依然残存在你的硬盘中、拥有超过15年历史的陈旧C编译器所产生的代码都是非托管代码。托管代码直接编译成目标计算机的机械码,这些代码只能运行在编译出它们的计算机上,或者是其它相同处理器或者几乎同样处理器的计算机上。非托管代码不能享受一些运行库所提供的服务,例如安全和内存管理等。若是非托管代码须要进行内存管理等服务,就必须显式地调用操做系统的接口,一般来讲,它们会调用Windows SDK所提供的API来实现。就最近的状况来看,非托管程序会经过COM接口来获取操做系统服务。

  跟Visual Studio平台的其余编程语言不同,Visual C++能够建立非托管程序。当你建立一个项目,而且选择名字以M FC,ATL或者Win32开头的项目类型,那么这个项目所产生的就是非托管程序。

托管代码和非托管代码的区别:

  一、托管代码是一种中间语言,运行在CLR上;非托管代码被编译为机器码,运行在机器上。

  二、托管代码独立于平台和语言,能更好的实现不一样语言平台之间的兼容;非托管代码依赖于平台和语言。

  三、托管代码可享受CLR提供的服务(如安全检测、垃圾回收等),不须要本身完成这些操做;非托管代码须要本身提供安全检测、垃圾回收等操做。

     

托管代码与非托管代码的性能比较      

基本上每一个人都知道的是,全部.Net语言都将被编译成为一个叫作IL汇编的中间语言。可是计算机是如何执行这个中间代码的,倒是不少人不知道,甚至理解错误了的。JIT是.NET程序运行的重要部件之一,全称是即时编译器。不少人都觉得JIT其实就是跟Java VM差很少的东西,是一个Interpreter,在运行时读取IL汇编代码,而后模拟成x86代码(也就是俗称的虚拟机)。可是事实上,.NET使用的是更为高级的技术。 .Net程序被加载入内存之后,当某段IL代码被第一次运行的时候,JIT编译器就会将这段IL代码,所有编译成本地代码,而后再执行。这也就是为何.NET程序第一次运行都启动很慢的缘由! 随.NET库,微软还附带了一个工具,能够事先将.NET程序全部的IL代码都编译成本地代码并保存在缓存区中,这样一来,这个程序就跟c++编译的如出一辙了,没有任何区别,运行时也能够脱离JIT了(这里不要混淆了,这里不是说能够脱离.NET库,而是说不须要在进行即时编译这个过程了)。因此,请不要将.NET和Java混为一谈,两个的运行效率根本不是一个等级的!

  JIT的优化指的是能够针对本地CPU,在编译时进行优化。传统程序在编译时,为了保证兼容性,一般使用最通用的指令集(好比古老的386指令集)来编译。而JIT知道CPU的具体类型,能够充分利用这些附加指令集进行编译,这样的性能提高是很可观的。