我知道JVM和CLR都是基于栈的虚拟机。当JIT将字节码编译成本地代码时,它是否也会将栈原语(load/store)翻译成X86平台上的寄存器?
如果是这样,似乎无论字节码是基于栈还是寄存器,都并不重要。JIT才是关键。
我知道JVM和CLR都是基于栈的虚拟机。当JIT将字节码编译成本地代码时,它是否也会将栈原语(load/store)翻译成X86平台上的寄存器?
如果是这样,似乎无论字节码是基于栈还是寄存器,都并不重要。JIT才是关键。
在x86核心上不使用寄存器是不可能的。处理器没有指令可以添加两个局部变量。其中一个必须在寄存器中加载。然后您可以将寄存器中的值与变量中的值相加。并将结果存回堆栈变量。
从这个序列中可以看出优化机会。比如不将其存回而将结果保留在寄存器中,并在以后使用它,节省了存储和加载。这是优化器的工作,它寻找利用可用寄存器的最佳方法。
唯一确定的方法是检查JIT编译输出,但可以肯定的是使用寄存器是JIT编译器最差的优化之一。我相信大多数程序员很难编写比JIT编译器更快的代码。
JIT编译器有很多功能,可能会尽可能地使用寄存器。像方法内联这样的东西鼓励使用寄存器,并且许多命令式程序代码可以在基于寄存器的架构上更简单地表达,因此JIT编译器使用寄存器是有意义的。