本文借鉴《自己动手实现Lua:虚拟机、编译器和标准库》,算是对自己学习的总结,也希望分享下所学知识~~
二进制chunk之所以使用二进制格式,是为了方便虚拟机加载,然后对人类很不友好
那咋办呢?
luac -l 可以切换到反编译模式
$lua -l hello_world.luac
main <hello_world.lua:0,0>(4 intructions at 0x7fc43fc02e40)
0+ param, 2 slots, 1 upvalue, 0 locals, 2 constant, 0 functions
1 [1]GETTABUP 0 0-1 ; _ENV "print"
2 [1]LOADK 1-2 ; "Hello, World!";
3 [1]CALL 0 2 1
4 [1]RETURN 0 1
因为没有函数定义,所以回生成一个main函数
如果lua程序里有函数定义,那么luac反编译器会按顺序依次输出这些函数原型的信息
信息说明:
1.前两行是函数的基本信息,后面是指令列表
a.如果是main开头,是编辑器声明的主函数;如果是以function开头的,说明这是一个普通函数。
b.接着是定义函数的源文件名和函数在文件的起止行号(对于main函数,起止行号都是0),然后是指令数和函数地址。
c.第二行依次是:函数的固定参数数量(如果有+号,表示这是一个vararg[可变参数])、运行函数所必要的寄存器数量,upvalue数量,局部变量数量、常亮数量,子函数数量。
2.指令列表的每一条指令都包含指令序号、对应行号、操作码和操作数(分号后面是luac根据指令操作数生成的注释)
PS:如果想看详细的输出,可以使用两个 -l
$lua -l -l hello_world.luac
网友评论