AOT和JIT:
AOT(Ahead Of Time):指在程序运行前,将源码编译成目标平台的机器码的过程。
特点:
- 快速启动:由于没有运行时编译步骤,程序启动速度更快
- 运行时性能更好:减少了JIT编译器的运行时开销,提高了整体性能
- 代码体积小:可以进行全局优化,能生成更紧凑的代码
JIT(Just In Time):指程序边运行边编译代码的技术
特点:
- 及时编译:在程序运行中,将字节码转为机器码,而不是像AOT那样提前生成
- 启动时间慢:因为需要在运行时进行编译,启动时间可能比预编译的程序要长
- 跨平台支持:同一份字节码能在不同平台上运行,无需修改源码
- 运行时优化:能在运行时优化,显著提高程序的执行效率
- 内存开销更大:JIT编译器需要额外的内存来存储编译后的机器码和相关数据
解释执行(Interpreter Execution):解释器组条解析和执行源码或中间代码(IL)的技术
特点:
- 在解释执行中,程序代码不会被被编译成本地机器码,而是会逐条读取源代码或中间代码的指令
- 与JIT相比,解释执行速度较慢,因为每条指令都需要解析和执行,而不是预先编译为高效的本地机器码
- 由于动态解析和执行,解释执行器可能需要更多的内存和CPU资源来处理相同的工作量。
- 无法进行像JIT编译那样的静态优化,导致一些性能上的限制
.NET的CLR(Common Language Runtime,公共语言运行时):是.NET框架的核心组件之一
特点:
- CLR将中间语言(IL代码)编译成机器代码,并在目标平台上执行。这可以通过JIT或者AOT编译实现
- GC(Garbage Collection)自动管理内存,减少内存泄漏和无效引用
- CLR支持多种编程语言(C#,VB.NET,F#等),这些语言编译后的代码都在CLR中运行
- 有公共类型系统(CTS),定义所有CLR支持语言所共有的数据类型和编程结构,确保不同语言间可以互相操作。
- 有代码访问安全性(CAS),控制代码能够支持的操作,限制其访问资源的能力。
IOS禁止JIT,游戏需要热更的罪魁祸首
ilruntime热更原理
- ilruntime通过解释执行来运行中间语言代码(IL),而不是将其及时编译为机器码,解释执行不涉及生成新的机器码,因此符合IOS的安全和平台限制
- 解释执行方式允许ILR在在运行时动态加载和执行新的IL代码,这使得热更新成为可能。