AOT 和 JIT 的区别

目前,程序主要有两种运行方式:静态编译和动态解释。

  • 静态编译的程序在执行前全部被翻译为机器码,通常将这种类型称为 AOT(Ahead of time),即“提前编译”;
  • 动态解释的程序则是一句一句边翻译边运行,通常将这种类型称为 JIT(Just in time),即“即时编译”。

AOT 程序的典型代表是用 C/C++ 开发的应用,它们必须在执行前编译成机器码;而 JIT 的代表非常多,如 JavaScript、Python 等。事实上,所有脚本语言都支持 JIT 模式。但需要注意的是 JIT 和 AOT 指的是程序运行方式,和编程语言并非强关联的,有的语言既可以以 JIT 方式运行也可以以 AOT 方式运行,如 Java 和 Python。它们可以在第一次执行时编译成中间字节码,之后就可以直接执行字节码。

也许有人会说,中间字节码并非机器码,在程序执行时仍然需要动态将字节码转为机器码。是的,这没有错,不过通常我们区分是否为 AOT 的标准就是看代码在执行之前是否需要编译,只要需要编译,无论其编译产物是字节码还是机器码,都属于 AOT。