AOT(Ahead-of-Time,预编译)
AOT 编译是一种编译策略,代码在程序运行之前就被编译成机器码,而不是在运行时才编译。
典型特点:
- 启动速度快,因为无需运行时编译
- 可在编译期做更激进的全局优化
- 生成的二进制文件可独立分发,无需附带编译器/运行时
- 缺少运行时信息,无法针对实际执行路径做特化优化
代表性实现:C/C++ 编译(GCC、Clang、MSVC)、Go 编译器、Rust 编译器、.NET Native AOT、GraalVM Native Image
JIT(Just-in-Time,即时编译)
JIT 编译是一种在程序运行时将中间表示(字节码、IR)动态编译为本地机器码的策略。
典型特点:
- 可根据运行时的热点路径做针对性优化(Profile-Guided Optimization)
- 启动较慢(需要预热),稳态性能可能超过 AOT
- 需要运行时环境(如 JVM、CLR、V8)
- 内存开销较大(需同时保留中间表示与编译后的机器码)
代表性实现:JVM HotSpot、.NET CLR、V8(JavaScript)、LuaJIT、PyPy
AOT 与 JIT 的对比
| 维度 | AOT | JIT |
|---|---|---|
| 编译时机 | 运行前 | 运行时 |
| 启动速度 | 快 | 慢(需预热) |
| 稳态性能 | 取决于静态分析能力 | 可利用运行时信息做特化优化 |
| 分发体积 | 较大(含完整机器码) | 较小(分发中间表示即可) |
| 跨平台 | 需为每个目标平台单独编译 | 中间表示天然跨平台 |
| 内存占用 | 较低 | 较高(运行时+编译器开销) |
许多现代语言/运行时采用混合策略:先 AOT 编译到中间表示,再由 JIT 在运行时做进一步优化(如 Java、C#)。