4

扩展 Lua 的常量类型

 2 years ago
source link: https://blog.codingnow.com/2021/04/lua_constant.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

扩展 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 编译器,也能做的更高效一些。

云风 提交于 April 25, 2021 11:12 AM | 固定链接


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK