lua的解释器拿到 lua 编写的源码,首先进行解析,就是进行词法分析和语法分析,将源码转换成 lua 的指令集,然后执行这个指令集。
lua 源码:
function f(val) return val; end function main() local i = 1; local j = 2; local b = i + f(2); --local b = i + j; print("retval = "..b); return b; end
调用 main 的指令集分析:
in while opcode = [CALLFUNC]. -- main in while opcode = [NOP]. in while opcode = [SETFUNCTION]. in while opcode = [ADJUST]. in while opcode = [NOP]. in while opcode = [SETLINE]. in while opcode = [PUSH1]. -- i in while opcode = [SETLINE]. in while opcode = [PUSH2]. -- j in while opcode = [SETLINE]. -- local b = i + f(2) in while opcode = [PUSHLOCAL0]. -- i in while opcode = [PUSHGLOBAL]. -- f in while opcode = [PUSHMARK]. in while opcode = [PUSH2]. -- val in while opcode = [CALLFUNC]. -- f() in while opcode = [NOP]. in while opcode = [SETFUNCTION]. in while opcode = [ADJUST]. in while opcode = [NOP]. in while opcode = [SETLINE]. in while opcode = [PUSHLOCAL0]. -- val in while opcode = [RESET]. in while opcode = [RETCODE]. in while opcode = [SETLINE]. in while opcode = [ADJUST]. in while opcode = [ADDOP]. -- local b = i + f(2) in while opcode = [SETLINE]. in while opcode = [NOP]. in while opcode = [PUSHGLOBAL]. -- print in while opcode = [PUSHMARK]. in while opcode = [PUSHSTRING]. -- retval = in while opcode = [PUSHLOCAL2]. -- b in while opcode = [CONCOP]. in while opcode = [CALLFUNC]. -- print() retval = 3 in while opcode = [ADJUST]. in while opcode = [SETLINE]. in while opcode = [PUSHLOCAL2]. in while opcode = [RESET]. in while opcode = [RETCODE]. in while opcode = [HALT].
PS:
函数就是一个入口地址,入口是通向将要执行的指令集。想下 汇编 中的 call,ret。lua 中的虚拟指令类似,只不过入口中的指令集是 lua 自己的虚拟指令,不是像 c 那样的机器指令。