0. 机器码 直接由机器码对应平台的CPU执行的指令集, 所以没法在其余指令集的CPU上运行. 没法跨平台. 由本地代码编译获得. (托管代码经过JIT生成)html
1. 字节码 即 bytecode 是一种中间码. 通常由JIT编译器解释编译成机器码再在本机上执行. 能够跨平台.程序员
2. CLR = 公共语言运行库CLR (Common Language Runtime) .net 框架下多种语言的统一运行框架(虚拟机). 和Java VM 类型的运行时环境. 至关于全部的.net 语言(C#, VB.NET, ASP之类的) 的底层引擎. 能够协调这类语言的统一运行机制.算法
框架能够把上述语言都转换为IL(中间语言 Intermediate Language). 而后再由JIT编译器(Just In Time Complier 即时编译器) 边执行边解释编译成机器码执行. 从而造成大一统的环境, 实现运行时根据平台编译生成机器码的跨平台的特性.编程
图片From http://www.javashuo.com/article/p-oyulijzo-et.html安全
3. IL(中间语言 Intermediate Language) 一种用于 .net框架下全部语言统一转化获得的语言. 能够由JIT解释执行, 实现跨平台. 如上述连接框架
4. 托管代码 = managed code = 公共语言运行库CLR (Common Language Runtime) 环境下执行的代码, 基于.net framework的代码. 受CLR的托管. 不须要程序员关心GC之类的内容.ide
通俗说就是.net平台下的开发, 都属于托管代码. 好比咱们写的Unity的C#. 编译结果是bytecode(字节码)函数
优势: 程序猿不须要关心GC, 指针之类的头疼事情, 有丰富的封装, 框架提供的类库之类的.工具
缺点: 有便利就失去了灵活性和自主性, 严格按规矩办事. 学会和各类.net框架版本友好相处.性能
5. 非托管代码 = Native Code = 本地代码 即: 没有.net虚拟机(或者JVM) 管理执行的代码. 编译结果是特定平台的机器码. 不能一次编译跨平台执行. 每一个平台须要单独编译.
直接由OS执行. 由程序员本身管理(GC等), 直接和OS打交道的开发. 好比咱们写的C++ Native DLL.
https://baike.baidu.com/item/native/13128691
https://baike.baidu.com/item/%E6%9C%AC%E5%9C%B0%E4%BB%A3%E7%A0%81
优势: 运行效率高. 高度灵活性, 高度自治, 执行各类底层操做. 只有想不到, 没有作不到.(依赖OS)
缺点: 刀尖上跳舞, 注意安全. 须要工具本身造(找).
6. unsafe = 不安全代码 = .net 托管代码中实现一些CLR不支持的(没法管理, 不保证安全), 非托管代码才有的功能. 好比指针. 必须用unsafe关键字包起来才可使用.用于告诉CLR和程序员本身, 这块代码是非安全的.
不安全代码并非说"不安全", 只是从设计者(程序员)的角度来看是清楚的, 安全的. 必须用关键字包起来是避免程序员无心识间使用到了非安全的编码方式.
也能够标识出非安全的代码段, 提供一些非安全的编程特性(fixed). 避免CLR按管理通常托管代码的方式去管理该段代码, 引发不符合程序员的设计思路的后果.
也许是为了实现CLR类型安全的目标吧,默认状况下,C#没有提供指针的使用算法,可是有些状况下也可能须要指针这样直接访问内存的东西(虽然目前我尚未用过),可是有时候程序员很是清楚程序的运行情况,须要使用指针直接访问内存以便于提升性能或者调试、监控程序运行的内存的使用情况,以便于采起相应的措施。还有一些状况是当咱们须要调用外面DLL中的函数又不能使用DllImport 时,也须要指针来传递这些函数。
引用自:http://www.javashuo.com/article/p-guxjjqbm-em.html
Unsafe code is in fact a "safe" feature from the perspective of both developers and users. Unsafe code must be clearly marked with the modifier unsafe
, so developers can't possibly use unsafe features accidentally, and the execution engine works to ensure that unsafe code cannot be executed in an untrusted environment.
引用自: MS DOC: https://docs.microsoft.com/zh-cn/dotnet/csharp/language-reference/language-specification/unsafe-code
7. fixed = 固定变量, 锁定指针对应变量的内存地址, 避免CLR GC移动该变量的位置.
fixed 语句设置指向托管变量的指针,并在执行该语句期间"固定"此变量。这样就能够防止变量的重定位
引用自:http://www.javashuo.com/article/p-guxjjqbm-em.html