相比lua2.1和lua2.2之间的差异,lua2.4相对于lua2.2有更多的不同。

 


 

语法分析方面2.4做出了针对调试的修改。

 


 

lua2.4中添加了一个功能是可以将分析好的指令输出到一个文件中保存起来,另外在运行的时候可以从这个文件中加载

出来并执行,后面将详细地描述二进制文件的构成。

 


 

lua2.4中提供调试和性能查看接口,这部分内容其实是非常重要的内容,后面会有单独地一篇文章来讲述。

 


 

为“getglobal”提供新的错误处理过程,具体的处理方法是在栈上放置一个nil对象来代替找不到的对象。

 


 

lua2.4中取消掉“锁数组”(锁数组的存在是为了不让对象被垃圾回收掉),取而代之的是引用数组,每一个引用都用

四种状态:保持(HOLD),锁(LOCK),已回收(COLLECTED),空闲(FREE)。空闲态的引用可被分配,

保持和锁状态的对象是正在被使用状态,锁态阻止垃圾回收掉引用所指向的对象,而保持态做不到,垃圾回收之后就

会变成已回收态,在这个地方有个很让人疑惑问题:已回收态不会自动变成其他状态,也就是说必须是用户自己通过

lua_unref接口释放这个引用,否则将一直不可用。

 


 

2.4的标准库中提供新的函数

 


 

每个字符串只有一份,不会出现多份拷贝?这个倒还不好找是怎么实现的,我们先从词法分析的时候遇到字符串开始吧:

通过分析代码发现分配字符的最终函数是luaI_createfixedstring,这个函数通过判断如果字符串是否存在然后如果存

在将返回它的指针的方式保证了每个字符串只占用一个空间,不会出现多份拷贝,另外有个重点是如果字符串的mark值

(用于判断是否需要垃圾的字段)是0的时候,将其置为2(为什么是2?)以阻止被垃圾回收掉。并且需要注意的是一旦置上

2之后就再也不能被回收掉了。所以在lua2.4中只能是字符串常量才能被赋值这个“不死标记”。我们现在可以得到结论:

字符串常量在内存中没有拷贝。

 


 

lua2.4的每个函数都会记录自己拥有的局部变量以及每个局部变量所在的行数。

 


 

lua2.4的table的容量将突破65536达到0x7FFFFFFF。

 


 

lua2.4支持断言。

 


lua2.4中每个函数的调用前后分别有一次机会让我们执行自己的代码(钩子,目前用于调试系统)。