Interpreter ,JIT ,AOT
Interpeter(解释器)
通俗的说解释器就是将程序员编写的代码一条条的转译执行,在解释执行代码的同时,也维护了一个栈去存放method的传入参数、局部变量、保存当前线程的context信息。
解释器的优势在于占用内存少(可以理解为解释一条扔一条),劣势就是执行效率低下。
JIT(动态编译器)
一般JIT会和一个解释器混合执行代码,JIT的作用是将热点代码编译成机器指令,很明显这样做的缺点就是编译后的机器代码会占用一些存储空间。所以,什么样的代码算是热点代码呢?
举常见的Method-Based JIT的栗子吧,这种JIT在代码解释过程中会针对每个method做profiling(检测),通俗点就是用一个计数器对函数调用次数做统计,方法每调用一次,计数器加1,
调用次数突破threshold(门槛值)之后JIT就会对该方法做编译,这样下次再调用这个方法的时候就可以直接执行机器指令,从而提高执行效率
AOT(静态编译器)
典型的代表就是C和C++语言的编译器。它最大的特点就是在代码运行之前先将所有代码编译为机器指令,显然这样做的优点是执行速度快
其他要说的
JIT和AOT指的是程序运行方式,和编程语言并非强关联的,有些语言既可以以JIT方式运行也可以以AOT方式运行,如Java、Python,它们可以在第一次执行时编译成中间字节码、然后在之后执行时可以直接执行字节码,也许有人会说,中间字节码并非机器码,在程序执行时仍然需要动态将字节码转为机器码,是的,这没有错,不过通常我们区分是否为AOT的标准就是看代码在执行之前是否需要编译,只要需要编译,无论其编译产物是字节码还是机器码,都属于AOT。