美文网首页
鹅厂实习周记(一)之Lua - Proto

鹅厂实习周记(一)之Lua - Proto

作者: GlossimarWan | 来源:发表于2019-05-16 14:38 被阅读0次

最开始想说的话

其实我是一个真实的Android应用开发程序猿,但是入职以后发现组里用的是C++,C#等语言,而且和Android的关系也不是很大,然后我就开始了转型之路啦~

已经实习了小半个月了,但是现在才想起写周记,想在这里记录一下自己学习到的东西,和大家一起分享。但是实习用到的东西对我来说基本上是全新的知识,所以有很多不足的地方,欢迎大家指正,么么哒

Lua源码解析 - Proto

因为在做的项目涉及到lua语言,所以我去学习观摩了一下大名鼎鼎的Lua的源码(源码核心大概是几千行,和其他语言比起来着实不多),看看其实现原理。在lua中我觉得有一个很重要的struct就是Proto。

Proto是在语法分析,语义分析的产物,即分析阶段的产物,执行阶段(LuaV_execute()) 就是使用的Proto来执行虚拟机指令。在生成Proto的过程中也会涉及其他的很多结构,比如CallInfo,Lua_State, 就不赘述啦,其实是因为自己理解的也不到位,hhh。

Proto 简述(其实是乱七八糟啥都说)

Proto定义在lobject这个文件中,lobject在Lua中负责对象管理,文件中的对外接口前缀为LuaO_,也就是说如果你在一个源码文件中看到了一个方法是LuaO_XXXX()那么这个方法的定义和声明一定是lobject文件中。每一段Lua代码在经过分析过程后将代码的信息存进Proto, 每一个新的Proto生成和初始化时都在lfunc文件的LuaF_newproto(Lua_State *L)方法中。

Proto *luaF_newproto (lua_State *L) {
  GCObject *o = luaC_newobj(L, LUA_TPROTO, sizeof(Proto));
  Proto *f = gco2p(o);
  f->k = NULL;
  f->sizek = 0;
  f->p = NULL;
  f->sizep = 0;
  f->code = NULL;
  f->cache = NULL;
  f->cachemiss = 0;
  f->sizecode = 0;
  f->lineinfo = NULL;
  f->sizelineinfo = 0;
  f->abslineinfo = NULL;
  f->sizeabslineinfo = 0;
  f->upvalues = NULL;
  f->sizeupvalues = 0;
  f->numparams = 0;
  f->is_vararg = 0;
  f->maxstacksize = 0;
  f->locvars = NULL;
  f->sizelocvars = 0;
  f->linedefined = 0;
  f->lastlinedefined = 0;
  f->source = NULL;
  f->rettype = NULL;
  f->args = NULL;
  return f;
}

Proto存储了:

  • 函数的常量数组;
  • 编译生成的字节码信息,存储在Proto的code成员中
  • 函数的局部变量信息
  • 保存upvalue名字的数组

Proto最重要的一个点就是,每一段lua代码经过分析后在Proto中都是独立的,也是不会重复的。比如,我想去分析lua执行过程中调用了几种不同的方法,只需要去比较每次调用的方法的Proto是否在之前已经存在过(Proto地址比较即可, 因为源码中Proto多是以指针形式存在)

总结

第一篇的试水就到这里啦就到,下次见~
最后放一张今日份开心,腾讯协会积分换的QQFamily的数据线(然鹅我并没有iphone,😂

QQFamily.png

相关文章

  • 鹅厂实习周记(一)之Lua - Proto

    最开始想说的话 其实我是一个真实的Android应用开发程序猿,但是入职以后发现组里用的是C++,C#等语言,而且...

  • 鹅厂实习| 周记(一)

    我胡汉三又回来了!在结束了本科最后一门考试后,如愿来到鹅厂,赶在毕业正式入职前,先来实习感受下工作氛围。现在刚结束...

  • 鹅厂实习| 周记(四)

    以下是本周的知识清单: TypedArray if-else优化 注解替代枚举 一点小感悟 1.TypedArra...

  • 鹅厂实习| 周记(二)

    以下是本周的知识清单: SparseArray atomic包 Android埋点 Java基础之注解 一点小感悟...

  • 鹅厂实习| 周记(三)

    以下是本周的知识清单: RemoteViews PendingIntent JNI & NDK & ADB 一点小...

  • 鹅厂实习周记(三)之Lua 使用C函数生成的so动态链接库

    Lua是可以调用C函数的,将c函数生成so库就可以动态链接进lua中调用啦。但是觉得坑还是挺多的。主要原因: 生成...

  • 鹅厂实习日记五

    关键词 粗心 上午到公司交付了上周留下的邮件bannes制作的任务,拿给经理改。反反复复改了很多遍,每次都是细节出...

  • 鹅厂实习日记3

    入职第三天。依照惯例等候班车,到达公司。不断的搜索简历筛选推荐跟进,没什么太大变化。中午跟家欣吃饭的时候聊了一会。...

  • 鹅厂实习日记2

    今天正式上班第二天。早晨6:57就醒了,按照惯例背了单词。起床洗漱刷牙,等朋友一起去等公司班车。8:24班车到达接...

  • 鹅厂实习日记5

    今天阳光很好 工作很轻松很顺心 收到表扬很开心 认识一个泰国同事很开心 用十倍苦心 做突出一个

网友评论

      本文标题:鹅厂实习周记(一)之Lua - Proto

      本文链接:https://www.haomeiwen.com/subject/wcvmnqtx.html