扩展 Lua 的常量类型
最近有点关于 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 编译器,也能做的更高效一些。
Comments
Posted by: metaworm | (4) December 17, 2021 03:49 PM
Posted by: shankusu2017 | (3) June 12, 2021 07:50 AM
Posted by: shankusu2017 | (2) June 12, 2021 07:49 AM
Posted by: awk | (1) April 25, 2021 02:26 PM