小鱼塘

  • 小玩意
  • 小想法
记录自己技术和想法地方
  1. 首页
  2. 编程语言
  3. 正文

lua 源码简单分析

10月 1, 2021 347点热度 0人点赞 0条评论
内容纲要

一,背景

这类技术自己没有研究过,只是用过lua,当时只是感觉跟JS一样,没有特别的感觉,他的代码非常少,我下载1.0的代码。

二,概括

通过lex与yacc 进行词法和语法分析,语法分析加了自己的c语言的逻辑代码。

三,分析

lua_dofile 加载指定的lua文件。

int lua_parse (void)
{
 Byte *initcode = maincode;
 err = 0;
 if (yyparse () || (err==1)) return 1;
 *maincode++ = HALT;
 //PrintCode();
 if (lua_execute (initcode)) return 1;
 maincode = initcode;
 return 0;
}

yyparse 进行词法分析与语法分析【这个是编译通用工具,不过我没有使用过,我只是网上查资料了解到】

int lua_execute (Byte *pc)
{
 while (1)
 {
  switch ((OpCode)*pc++)
  {
   case NOP: break;
   
   case PUSHNIL: tag(top++) = T_NIL; break;
   
   case PUSH0: tag(top) = T_NUMBER; nvalue(top++) = 0; break;
   case PUSH1: tag(top) = T_NUMBER; nvalue(top++) = 1; break;
   case PUSH2: tag(top) = T_NUMBER; nvalue(top++) = 2; break;

   case PUSHBYTE: tag(top) = T_NUMBER; nvalue(top++) = *pc++; break;
   
   case PUSHWORD: 
    tag(top) = T_NUMBER; nvalue(top++) = *((Word *)(pc)); pc += sizeof(Word);
   break;
...............

while 取指令,然后执行对应行为,变量处理通过top 堆栈进行操作。

四,样例

local a = 10 * 6;
print(a)
PUSHBYTE   10
PUSHBYTE   6
MULTOP
PUSHGLOBAL   4 //获取print对象,这个存在全局table 函数数组里面
PUSHMARK
PUSHGLOBAL   33 //a 这个变量
CALLFUNC
ADJUST   0

这个生成对应的字节码,然后调用lua_execute 执行,你可以下断点自己测试。

五,vscode 编译调试[windows]

因为我觉得直接用vs 编译调试感觉太重了,于是采用vscode来编译。

  • 下载mingw MinGW下载和安装教程 (biancheng.net)
  • 点击vscode 调试,点击gdb
  • 设置对应的命令 gcc *.c -g 即可

标签: lua
最后更新:10月 1, 2021

小鱼儿

爱研究技术,爱玩LOL

点赞
下一篇 >

COPYRIGHT © 2022 小鱼塘. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang

湘ICP备18005349号