lua
文章平均质量分 63
ht8269
这个作者很懒,什么都没留下…
展开
-
lua2.1垃圾回收机制
lua2.1采用的是“标记-清理”的垃圾回收方法,垃圾回收入口函数是lua_pack。 这个函数会在两个地方被调用,一个是创建字符串的时候(lua_createstring),另外一个是创建哈希表的时候(lua_createarray)。这也说明了这两种操作分配的资源将被列入垃圾回收范围之内。 字符串:在lua中的字符串是一个TaggedString,这个结构中有原创 2010-04-13 22:43:00 · 1719 阅读 · 0 评论 -
lua2.4和lua2.2的对比
相比lua2.1和lua2.2之间的差异,lua2.4相对于lua2.2有更多的不同。 语法分析方面2.4做出了针对调试的修改。 lua2.4中添加了一个功能是可以将分析好的指令输出到一个文件中保存起来,另外在运行的时候可以从这个文件中加载出来并执行,后面将详细地描述二进制文件的构成。 lua2.4中提供调试和性能查看接口,这部分内容其实是原创 2010-05-02 22:54:00 · 496 阅读 · 0 评论 -
lua2.2与lua2.1的对比
文法解析方面:1、在分析函数的时候我们需要将已经分析的指令保存起来,lua2.2提供了函数savemain和change2main来保存和恢复(其实我觉得change2main如果取名为recovermain会更合适)。 2、添加非终结符globalstat:globalstat -> stat sc | setdebug 3、取消非终结符method,添加fun原创 2010-05-02 20:55:00 · 442 阅读 · 0 评论 -
lua2.5和lua2.4的对比
lua2.5最重大的变化是字符串操作库中增加了简单的正则表达式匹配的方法。显然如果讨论正则表达式的实现的话可不是那么容易的,而且也超出了本文的范围。所以这里暂不深究。在lua2.2中我们就遇到CBase和CnResult,在lua2.5中首次将这两个值打包到一个结构C_Lua_Stack中,估计作者觉得也该让代码看起来更舒服一点了。lua_dofile 和l原创 2010-05-03 10:20:00 · 535 阅读 · 0 评论 -
lua其他版本分析准备
终于将lua2.1的各个比较重要的部分分析完成,虽然还有一些地方没有涉及,后面我会继续补上。不过任务远未结束,接下的我们将沿着时间的轨迹继续分析lua2.1之后的各个版本,有了lua2.1为基础,我想后面的任务将会变得轻松而愉快。 现在先说说后面的分析思路,我们将不再采用大而全的分析方式,取而代之的是对比式分析,也就是用当前版本和上一个版进行对比而得到的差异,然后对差异分析,总原创 2010-05-02 15:03:00 · 287 阅读 · 0 评论 -
lua2.1 C操作lua的须知细节
1)CBase在C调用lua函数的时候可用,它表示了最后参数的后面一个对象相对与栈底的偏移值。 2)通过lua_call可以增加CBase,目标函数有多少返回值它就增加多少(将结果整合到栈上,整合到栈上是为了能找到这个值)。如果我们总是不断地调用lua函数,那么CBase会不断地增加,直到内存耗光,所以在调用完一个lua函数之后一定要将结果出栈。(很遗憾的是现在暂时没有发现2.原创 2010-05-02 11:33:00 · 417 阅读 · 0 评论 -
lua2.1 全局变量和局部变量(完善中)
变量是lua2.1中的基石,由于各变量的作用的不同,我们一般分为全局变量和局部变量,在lua2.1中也有这两种变量,但是在其内部的具体实现的却很难让人理解,本文主要来探讨lua2.1中全局变量和局部变量的具体实现细节。 与以往的分析不同,这次我们先来个实例。 b = 1;function func1(c) local d, d1; local e;原创 2010-05-01 10:26:00 · 3815 阅读 · 3 评论 -
lua2.1 语法解析过程(3)
在“lua2.1 语法解析过程(2)(编辑中)”一文中我们分析了表达式expr,接下来在本文中将分析另外一个重要的非终结符:stat --语句。 stat -> stat1 忽略 stat1 -> if expr1 then PrepJump block PrepJump elsepart end: 一个小小的if语句看似简单,但是在语法构造上却如此复杂。if语原创 2010-05-01 08:57:00 · 447 阅读 · 0 评论 -
lua2.1函数调用过程分析(完善中)
函数调用过程在lua2.1中的实现异常难读懂,所以这里专门以一篇文章来分析。 已有知识: 比如func1(a, b) body end func1(1, 2)时依次执行的指令是PUSHGLOBAL index(func1) PUSH1 PUSH2 CALLFUNC 2 1 执行到指令CALLFUNC的时候,栈上自底向上有函数对象f,参数1和参数2. 我原创 2010-05-01 10:22:00 · 1165 阅读 · 0 评论 -
关于lua的调试
从lua2.4开始,lua针对调试下了不少功夫,调试的重要性自然不需要我强调,在本文中我们将通过剖析lua2.4的代码,了解lua是如何为实现调试系统并为外部提供调试接口的。 用于调试的指令:SETLINE n文件的每行语句结束后都会加上一条指令SETLINE,通过这条指令我们可以实现“断点”的功能。 为调试而设计的文法:关键字有$debug和$nodebug,词法分析过原创 2010-05-03 20:35:00 · 842 阅读 · 0 评论 -
lua2.1 语法解析过程(4)
例子1:function func1(c, e) local a1, a2; c = 2;end 指令:CODE1 ADJUST 23 ADJUST 44 PUSH25 STORELOCAL07 ADJUST 29 RETCODE 2 CODE0 RETCODE0原创 2010-05-02 08:44:00 · 437 阅读 · 0 评论 -
lua2.1 语法解析过程(2)
在上一篇“lua2.1语法解析过程(1)”中,我们已经了解了lua的词法和语法解析过程中的关键数据结构YYSTYPE,并且决定采用自下向上、以小见大的方方法来逐步分析,本文中重点关注lua2.1对“表达式”的解析过程(令YYSTYPE类型的全局量yylval): exp -> number:一个数据常量词法分析:yylval.vFloat保存number对应的数值,原创 2010-04-29 09:14:00 · 756 阅读 · 0 评论 -
lua2.1的文法
下面是lua2.1的文法,来自lua源代码中的lua.stx文件 终结符使用黑体表示非终结符使用斜体表示 functionlist -> null | functionlist stat sc | functionlist function | functionlist setdebug function -> function name bod原创 2010-04-15 14:33:00 · 497 阅读 · 0 评论 -
lua2.1的基本数据结构(有不确定的地方,请勿被误导)
lua2.1中主要有以下重要的数据结构: 1)全局对象表:所有的全局对象都会被放置到这个表中,在代码的实现上它就是Symbol对象的数组,对应的变量名为lua_table。在lua2.1的实现中总是尽可能地用这个数组中的索引来表示表中的对象。比如要取某个全局对象A,A的索引是i,那么对应的指令就是PUSHGLOBAL i 2)栈:lua2.1中的虚拟机是基于栈式的,基于栈式的虚原创 2010-04-15 00:36:00 · 486 阅读 · 0 评论 -
lua的更新文档(翻译中)
这里是Lua 4.0 版本3.2到4.0之间的改变---------------------------语言设计:+新语句:break和for语句+对全局变量的全局处理:全局变量将都放置到一个Lua table中+改进错误信息+no more $debug: full speed *and* full debug information+新的read原创 2010-04-13 15:34:00 · 474 阅读 · 0 评论 -
lua2.1的错误处理机制笔记(编辑中)
本文将探讨lua2.1的错误处理机制,在讲述的过程中涉及到一些lua2.1的指令,如果不熟悉这些指令的读者可以先阅读"lua2.1的指令笔记" 1、错误的类型在lua2.1中有一个全局的数组叫lua_fallback,这是一个全局数组,这个数组上的元素的数量是9,也就是说再lua2.1中一共有9种错误类型,如下: FB_ERROR (调用lua_message而产生)原创 2010-04-13 10:08:00 · 647 阅读 · 0 评论 -
lua2.1的指令笔记
为了方便讲述,这里规定了一些名称:T-1表示栈顶对象T-2表示栈顶元素的下一个对象T-3表示T-2的下一个对象 push系列: 【PUSHNIL】 将一个nil对象放置到栈顶。【PUSH0】 将数字0放置到栈顶【PUSH1】 将数字1放置到栈顶【PUSH2】 将数据2放置到栈顶【PUSHBYTE b】 将字节b放置到栈顶(这个版本中BY原创 2010-04-11 16:21:00 · 778 阅读 · 0 评论 -
lua算术表达式优先级笔记
从低到高:and or== ~= > = ..+ -* /- not^ (右连接) 最左推导的文法上的设计应该(高优先级的表达式总是作为低优先级表达式的最小不可分割因子)是:E -> E and ANDORT | E or ANDORT | ANDORTANDORT -> ANDORT == LOGICT | ANDORT ~= LO原创 2010-05-08 10:23:00 · 580 阅读 · 0 评论