luac只有 interpreter模式.
luajit分 interpreter 模式和 jit 模式,
- AOT(ahead-of-time compilation),只线下(offline)就将源代码编译成目标机器码,这是普遍用在系统程序语言中。也叫静态编译(static compilation)。
- 动态编译(dynamic compilation)指的是“在运行时进行编译”;与之相对的是事前编译(AOT)。
- JIT编译(just-in-time compilation)JIT编译是动态编译的一种特例,当虚拟机发现某个方法或代码块运行的特别频繁时,会把这些代码认定为“热点代码”(Hot Spot Code)。为了提高热点代码的执行效率,在运行时,虚拟机会把这些代码编译成本地平台相关的机器码,并进行各种层次的优化,并且保存下来以备下次直接使用,JIT快就快在这里,完成这个任务的编译器称为即时编译器
Luajit运行过程
LuaJIT部分平台无法使用
JIT模式在iOS以及其他有权限管制的平台(PS4,XBox)都不能使用。
为了安全,这些系统禁止了用户进程自行申请有执行权限的内存空间,因此无法在运行时编译出一段代码到内存然后执行。
LuaJIT一直稳定性能高吗?
1.JIT会编译出机器码,但供代码执行的内存空间有一定上限。
2.推导的机器码执行的结果不符,造成JIT失败。
3.local变量放在寄存器上,如果local 太多,寄存器不够用。
4.编译热点代码的时间有一定的开销。
5.在编译准备和识别频繁使用的方法需要占用时间,使得初始编译不能达到最高性能
对于某些代码的编译优化不能完全支持,官方有篇文档介绍如何优化
参考资料: