
LuaJIT源码分析
文章平均质量分 95
异次元的归来
Game_Develop_Forever
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
LuaJIT源码分析(六)语法分析
通过语法描述,我们可以知道,lua代码是以chunk为单位组成的,chunk又是由若干语句(statement)组成的,statement又分为普通的statement和最后结尾的last statement组成。上述EBNF描述中,{}包住的部分表示可以出现0次或者多次,[]包住的部分表示可以出现0次或者1次,大写字母开头(如Name,String,Number)和字体加粗的部分表示lua词法分析的token,它们不能继续用子表达式来进行描述。除此之外的情况,就都按赋值语句的规则进行解析。原创 2024-11-10 16:14:00 · 1171 阅读 · 0 评论 -
LuaJIT源码分析(五)词法分析
c表示当前扫描到的字符;剩下的逻辑其实就比较简单了,如果当前字符是数字,那么就走假设token是数字字面常量的逻辑;这些处理逻辑都比较简单,如果只通过当前字符无法判断token类型,就会去读取下一个字符甚至更多字符来进行判断。会返回当前扫描的token类型,LuaJIT只对那些不能用单字符表示的token,进行了定义,如果token本身就是单字符的,比如( + - / )之类,就直接用该字符作为它的token类型。lua的token可以分为若干不同的类型,比如关键字,标识符,字面量,运算符,分隔符等等。原创 2024-10-27 15:42:27 · 789 阅读 · 0 评论 -
LuaJIT源码分析(四)table
LuaJIT源码分析(四)tablelua的table是lua唯一的数据结构,可以用来表示所有的数据。它非常好用而且简洁,但是背后的实现却是十分的复杂。原创 2024-09-01 16:13:54 · 1430 阅读 · 0 评论 -
LuaJIT源码分析(三)字符串
由于每次新建字符串时都需要计算一次hash,这个函数调用会比较频繁,因此它是一个稀疏的hash函数,内部实现使用了lookup3 hash算法,只会取字符串中的常数个字节进行计算,所以函数的运行是一个常数的时间。lua的字符串是内化不可变的,也就是lua字符串变量存放的不是字符串的拷贝,而是字符串的引用。tab字段保存了所有字符串,它是个链表数组,每个新建的字符串先根据hash算法计算出自身的hash值,再根据当前StrInternState的mask,得到数组的索引,如果已经有元素,就插入到链表的头部。原创 2024-05-02 16:36:15 · 1241 阅读 · 0 评论 -
LuaJIT源码分析(二)数据类型
nil和bool类型是值类型,无需gc管理,而light userdata的定义就是外部管理的对象,只是将指针传给了lua,所以也不受lua的gc管理。的实现也比较巧妙,它不是直接去判断TValue是否为一个非NaN的double,而是尝试取出它的itype,如果itype比最后一个定义的LJ_TISNUM都还要小(注意itype的定义都是取反过的),那么说明它必定不是一个合法定义的TValue类型,也就只能是个double了。换句话说,只要满足这个条件,剩下的51位尾数,完全可以用来编码其他的数据。原创 2024-04-01 23:14:22 · 1277 阅读 · 0 评论 -
LuaJIT源码分析(一)搭建调试环境
浏览这个脚本,可以发现LuaJIT的编译分为三个部分,首先是build出一个minilua,它是lua原生代码的一个子集,用来判断当前平台是32位还是64位,并执行lua脚本并生成平台相关的指令;最后编译lua的各种lib,然后生成最终的LuaJIT。另外,脚本在编译结束时,会执行一些清理工作,把中间生成的代码,以及编译产生的obj都会删除掉。然后,我们在src同级目录下新建一个目录,用来存放vs工程,在vs中新建一个empty console C++工程,然后把src目录的头文件和源文件都添加进去。原创 2024-03-03 14:22:09 · 1847 阅读 · 0 评论