本文借鉴《自己动手实现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文件

如图所示:

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐