扩展 Lua 的常量类型

云风 2021-04-25 11:23

最近有点关于 Lua 不成熟的想法。

Lua 目前函数原型的常量表只支持了布尔、数字和字符串类型的常量。而 table function 这些是不会存在于常量表中的。

我想,如果常量如果不限于前三种类型,可能会更好一些。比如,一个惯用法是在代码前面写上

local pairs = pairs

这个惯用法是基于 local 变量比全局变量少一次 hash 表查询,性能可能会高一点。 但实际上,往往差距并不大。而这种写法还会给其它应用 pairs 的函数增加额外的 upvalue ,很有可能得不偿失。

但我们真正需要的是让 pairs 这个 light C function 是一个像 1,2,3 这样的常量。不必增加额外的 upvalue 的负担。

Lua 5.4 之后可以用 const 修饰 local 变量。

local pairs <const> = pairs

但 pairs 依旧不是常量。

我想,如果可以稍微修改一下这行代码的语义。当把一个全局变量赋值给 const 的 local 变量时,Lua 是在 load 的阶段就对全局变量求值,这样,pairs 就可以被放入常量表了。

而需要把代码编译成 bytecode 也没有关系,我们只需要把全局变量的名字记录在常量表中,等加载 bytecode 的时候再求值。

这样修改之后,相当于每个 lua chunk 就有了一张外部符号导入表。load 的阶段更接近静态语言的 link 阶段。如果以后需要给 Lua 加 JIT 或 AOT 编译器,也能做的更高效一些。

[返回] [原文链接]