神奇的 lua

从来没去了解过 lua,今天抽空看了一下原理,特此记录一下。

在此,我们先不去管 lua 的语法,仅就其神奇之处论之,看看它到底神在哪里。

lua 的神奇之处是它的解释器很小,目前 5.4.6 版本的二进制只有 300k,及其小巧!

唯其如此,它才可以被嵌入到服务端程序的内部!根据 lua 提供的 API,你可以在进程里启动一个 lua 虚拟机,来解释客户端提交上来的 lua 脚本或者字节码。

这还不算完,你还可以在进程里和 lua 脚本联动,在程序中提供 lua 脚本能访问的 API,之后就可以和 lua 脚本互相交换数据了,这就给了程序设计很大的自由空间,向客户端提供了操纵程序逻辑的摇杆。

lua 是用 C 语言写的,天然适配于 C 的后端,如果其它语言想要内嵌,则需要一个相关语言实现的 lua 解释器,比如 gopher-lua 就是 Go 语言实现的 lua 虚拟机和编译器,Go 程序就可以将其嵌入自身来解释 lua 脚本,并提供 API 给脚本使用,促成了程序功能的灵活多变性。

Redis 内嵌了 lua 的代码,提供了 lua 脚本可以访问的 Redis 对象。所以,你就可以在 lua 脚本里对 Redis 进行操作了。

Redis 使用 lua 脚本可以保证一组操作的原子性,我们知道 Redis 中的事务也可以做到,但是使用 lua 则更加灵活,你可以根据不同的条件执行不同的命令,这是事务所做不到的。

综上,lua 基本上就是“灵活” 的代名词!