1.c#的执行过程
2.Mono
3.IL2CPP
1.c#的执行过程
假如我们想让一个外国厨师(电脑cpu)做一道鱼香肉丝, 但cpu厨师只懂一种非常底层的机器语
言, 就像一套固定的手势和简单的指令(比如: 拿, 切, 炒, 放盐3克); 作为程序员, 写的c#
代码就像是用中文写的菜谱

cpu厨师看不懂中文菜谱, 那就需要一系列的翻译和解释过程; c#代码的执行过程分为三大步:
编写 -> 编译 -> 执行
1).编写代码
我们用Visual Studio, Rider等工具(IDE, 集成开发环境)
写下人类可读的c#代码(中文菜谱)
2).编译代码, 编译代码分为两个小步
a.编译为中间语言(il/cil)
- 角色登场: c#编译器(Roslyn)
- 过程: 当我们点击生成或运行时, c#编译器将写的中文菜谱(c#源代码)翻译成中间语
言il或通用中间语言(cil)的东西
这一步将我们的中文菜谱翻译成了通用菜谱, 但是cpu厨师还是看不懂的
b.打包为程序集(Assembly)
- 编译生成的il代码和相关资源会被打包成一个或多个.dll或.exe, 我们统称它们为程
序集; 比喻: 将世界通用菜谱语言写成的菜谱书被打包好, 准备送给厨师
3).设备上执行
现在, 打包好的通用菜谱要被送到厨房(设备)中, cpu厨师终于要上场, 但它还是看不懂通用菜
谱, 这个时候一位至关重要的翻译官出场
a.加载和JIT编译(jit compilation)
- clr 可以将它想象为整个厨房的环境和总管, .net程序必须在存在clr的环境中才能执行,
这个环境就是.net运行时
- jit编译器是clr的现场翻译官, 它的工作方式如下:
点菜, 当程序执行到某个方法(比如鱼香肉丝), clr才会把这段方法的il代码交给jit编译
器; jit编译器(现场翻译官)立刻将这段il代码编译成当前cpu平台能直接理解的原生机器
码; 执行并缓存, cpu会将拿到翻译好的指令, 立刻开始执行, jit编译器将已经翻译好的
机器码缓存起来
b.托管执行
程序在clr的管理下运行, 我们称之为托管执行; CLR这位总管在整个过程中提供了许多强大
的服务
- 垃圾回收 (Garbage Collection, GC): 自动帮你收拾厨房,把切完不要的菜梗、用过
的油碗(不再使用的内存)清理掉,你几乎不用担心“内存泄漏”的问题
- 类型安全 (Type Safety): 确保厨师不会错把糖当盐放,避免了很多低级错误
- 异常处理 (Exception Handling): 万一锅着火了(程序出错), 有一套机制来处理,不
会让整个厨房炸掉

2.Mono
Mono(虚拟机)是一个跨平台的, 开源的.net framework的实现

mono的方式处理il, il代码和一个包含jit即时编译器的完整运行时环境会进入我们的包
3.IL2CPP
il2cpp是unity自己开发的一套构建时的后端处理技术(il to cpp)将中间语言(il)转换为
c++代码

il2cpp的方式处理il, 纯原生机器码 + 一个不包含编译器的精简版运行时支持库