2.1 什么是二进制chunk

在Lua的行话里,一段可以被Lua解释器解释执行的代码就叫作chunk。chunk可以很小,小到只有一两条语句;也可以很大,大到包含成千上万条语句和复杂的函数定义。前面也提到过,为了获得较高的执行效率,Lua并不是直接解释执行chunk,而是先由编译器编译成内部结构(其中包含字节码等信息),然后再由虚拟机执行字节码。这种内部结构在Lua里就叫作预编译(Precompiled)chunk,由于采用了二进制格式,所以也叫二进制(Binary)chunk。

我们仍然以Java虚拟机作为对照,存放chunk的文件(一般以.lua为后缀)对应.java源文件,二进制chunk则对应编译好的class文件。Java的class文件里除了字节码外,还有常量池、行号表等信息,类似地,二进制chunk里也有这些信息。然而和Java不同的是,Lua程序员一般不需要关心二进制chunk,因为Lua解释器会在内部进行编译,如图2-1所示。

图2-1 隐式调用Lua编译器

Java提供了命令行工具javac,用来把Java源文件编译成class文件,类似地,Lua也提供了命令行工具luac,可以把Lua源代码编译成二进制chunk,并且保存成文件(默认文件名为luac.out)。Lua解释器可以直接加载并执行二进制chunk文件,如图2-2所示。

图2-2 显式调用Lua编译器

如前所述,Lua解释器会在内部编译Lua脚本,所以预编译并不会加快脚本执行的速度,但是预编译可以加快脚本加载的速度,并可以在一定程度上保护源代码。另外,luac还提供了反编译功能,方便我们查看二进制chunk内容和Lua虚拟机指令。下面详细介绍luac的用法。