xiao 在jit出现之前,可以认为java是一门解释型语言,也就是说执行引擎先获取java的字节码指令,然后执行引擎对字节码指令进行指令分配(这个过程由c++实现)然后对应执行c++代码(编译,执行),在jit出现之后,对于经常出现的字节码指令,将其对应平台的机器码缓存起来,当下次使用时,直接使用其缓存的的机器码,省去了指令分配的过程,也就加快了执行速度,那么这里我就有疑问了,为什么不把所有的java字节码指令都直接对应其平台的机器码指令呢?这样不更快了吗?
johnbanq 为什么不呢?在做了在做了.jpg 早年的ExcelsiorJET和现在的GraalVM native image都在这么干。 之所以不编译成机器码是因为要实现跨平台,方便一串代码到处运行,而机器码是平台甚至CPU相关的。 那么为什么还需要字节码,而不是发.java源文件呢?我猜想是因为早年Java是为家用电器等嵌入式设计的,.java没有字节码紧凑。当然,编译器也可以做优化,但是为了让Java平台的其它语言也可以受益,所以编译优化全都扔进了JIT引擎里,Java编译器中只有少量的优化