0. 机器码 直接由机器码对应平台的CPU执行的指令集, 因此无法在其他指令集的CPU上运行. 无法跨平台. 由本地代码编译得到. (托管代码通过JIT生成)
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 https://www.cnblogs.com/msxh/p/7819645.html
3. IL(中间语言 Intermediate Language) 一种用于 .net框架下所有语言统一转化得到的语言. 可以由JIT解释执行, 实现跨平台. 如上述链接
4. 托管代码 = managed code = 公共语言运行库CLR (Common Language Runtime) 环境下执行的代码, 基于.net framework的代码. 受CLR的托管. 不需要程序员关心GC之类的内容.
通俗说就是.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 时,也需要指针来传递这些函数。
引用自:https://www.cnblogs.com/lgx5/p/7353346.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 语句设置指向托管变量的指针,并在执行该语句期间"固定"此变量。这样就可以防止变量的重定位
引用自:https://www.cnblogs.com/lgx5/p/7353346.html
https://www.cnblogs.com/DswCnblog/p/5329576.html