探索,进取,坚持

Lua-5.1 编译分析一

分析lua的很多了,这里记录一下我的。

词法分析

lua-5.1词法分析在llex.c中,为了表达状态机lua实现了lexstate来存储使用的数据其中Mbuffer类型的buff每次会情况重置,然后从zio中再读一个字节 赋给current, next()会读一个字符,如图: Image
前端将文件token化读入,token化 Image
解析变量名luaX_newstring转换成一个tstring存进语义seminfo中,然后返回当前为token_name类型。

zio

其中zio读取文件到内存中处理,省去频繁文件i/o读增加效率.

lookahead

字节码转换指令生成

例如: helloworld.lua

-- the first program in every language

io.write("Hello world, from ",_VERSION,"!\n")

首先读的- 然后判断第二个token是不是‘-’如果是则为注释。 然后根据chunk处理
/* chunk -> { stat [`;'] } */
然后展开为stat:
/* stat -> func | assignment */
自上而下展开,主表达式primaryexp:

 /* primaryexp ->
        prefixexp { `.' NAME | `[' exp `]' | `:' NAME funcargs | funcargs } */

然后根据 . token展开:field 展开-》luaK_dischargevars 来判断变量类型:展开成lua5.1字节码存储起来成表达式信息。 如图: Image
然后读io 为token_name类型,则认为时global变VGLOBAL, Image
然后展开.write函数. 再到primaryexp函数解析函数()调用: Image
生成调用函数的call 寄存器保存指令,然后 保存函数参数到hash表,然后保存栈,然后括号匹配. 完成后下一行语句。 Image
整体自上而下展开。

后端执行

后端执行在执行在vm中执行,在\src\lvm.c是vm代码。luaV_execute执行指令。这里执行的指令已经是翻译好的字节码了。

ZJ

没有过多的剖析代码的细节,只分析总体大纲,在基础上有清楚认识之后开始单独分析。下面二、三将分析具体的实现细节。