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 的对比

维度AOTJIT
编译时机运行前运行时
启动速度慢(需预热)
稳态性能取决于静态分析能力可利用运行时信息做特化优化
分发体积较大(含完整机器码)较小(分发中间表示即可)
跨平台需为每个目标平台单独编译中间表示天然跨平台
内存占用较低较高(运行时+编译器开销)

许多现代语言/运行时采用混合策略:先 AOT 编译到中间表示,再由 JIT 在运行时做进一步优化(如 Java、C#)。