本文借鉴《自己动手实现Lua:虚拟机、编译器和标准库》,算是对自己学习的总结,也希望分享下所学知识~~
什么叫Chunk?
一段可以被Lua解释器解释执行的代码就叫做chunk
可以很小,小到只有一两条语句;可以很大,大到包含成千上万条语句喝复杂的函数定义
Lua为了提高效率,并不是直接解释执行chunk,先由编译器编译成内部结构(其中包括字节码等信息),再由虚拟机执行字节码
这种内部结构叫做:
**预编译(Precompiled)chunk,由于采用了二进制格式,也叫做二进制(binary)chunk
(预编译并不会加快脚本执行的速度,但是预编译可以加快脚本的加载速度)
(一般不需要关心二进制chunk,因为lua解释器会在内部进行编译)
如何把Lua源文件编译成chunk文件?
print("Hello World");
调用 luac 命令就可以编译指定的 Lua 源文件,成功后会出现 luac.out 文件(里面就是对应的二进制文件)
常用命令如下:
luac hello_world.lua #单纯的生成
luac -o hw.luac hello_world.lua #指定名称
luac -s hello_world.lua #不包含调试信息
luac -p hello_world.lua #只进行语法检查
Lua编辑器会以函数为单位进行编译,每一个函数都会被Lua编译器编译为一个内部结构
这个结构叫做:原型(Prototype)
主要包含六个部分:
1.函数基本信息(参数数量、局部变量数量)
2.字节码
3.常量表
4.Upvalue表(upValue 是局部变量?)
5.调试信息
6.子函数原型列表(可知函数原型是一种递归结构,lua源码中的函数的嵌套关系会直接反映在编译后的原型里)
如果没有函数,Lua编辑器会自动为脚本生成一i个main函数,并把整个程序都放进这个函数里,再以它为起点进行编译
function main(...)
print("")
return
end
把主函数编译成函数原型后,Lua编译器会给它再添加一个头部(Header)
然后一起dump成luac.out文件
如图所示: