前言
Lua 开发者通常听说或使用过 LuaJIT,但是可能因为种种原因未能理解其工作原理,在这里分享一篇 Jakob Erlandsson 和 Simon Kärrman 的硕士毕业论文,TigerShrimp: An Understandable Tracing JIT Compiler,该论文讲述了如何为 JVM 开发一个 Tracing JIT,并附带了源码以及可视化工具。下文将简要剖析一些其实现原理。
编译流程
TigerShrimp 基于 JVM Bytecode,使用 Javac
将 Java 代码文件编译为 .class
文件,后直接进行 decode .class
文件,通过这种方式绕过 Parser
阶段,得到 bytecode
。
执行流程
TigerShrimp 内部有个简单的 Interpreter
,用以直接执行 bytecode
,执行每一条 Instruction
时,会记录当前的 pc
(二元组,记录函数索引和指令索引,不然指令索引可能重复),是否为热路径,若为热路径,则会执行 record
流程,记录每一条执行的指令。(通常记录循环,循环有回边,记录执行次数,执行次数大于一阈值,则认为是热路径)。
若已经有 native code
,即已经是热路径并完成了生成机器码的工作,则直接执行 native code
。