Lua部分源代码分析(讨论lua的库是如何实现)

来源:互联网 发布:sql报表开发 编辑:程序博客网 时间:2024/05/16 01:08

           我们在使用lua的时候一定觉得这门语言很高级,什么都不用去处理而且速度很快,超过了一般的脚本语言,这是因为其实lua内部是由c来管理内存的分配和释放的,用起来有点像java的垃圾回收器一样,但完全不是一个东西,看过lua源码的人都知道,它是自己建立了一套lua内存管理机制的,由c语言完成真正的内存分配和释放。异同点只要看垃圾回收机制的三大要素就知道了。

        今天我来说下lua中有内置库的一些函数的组成,和自己如何对lua添加新的方法,

      

这个是大家常用的string库的导出函数表,这样大家肯定就知道lua和c是怎么关联的了,你用过string一定知道find这个函数了,我们就从这个函数的实现说起把,然后学会了这个,你就可以自己添加处理unicode编码的问题了,你可以仿照lstrlib和lstring这两块自己实现一个lua的unicode处理库。这课对没有c语言基础的人来说难度很大,建议大家看本文之前先去复习下c语言基础。然后再看本文,当然没学过c的建议去学习下,不想学习c的可以不用看本文了。

       废话不多说了,我们先来看代码:

static int str_find (lua_State *L) {  return str_find_aux(L, 1);}


这个好像很简单直接返回了另一个函数,那就让我们先看下这个函数吧,代码依然如下:

static int str_find_aux (lua_State *L, int find) {  size_t ls, lp;  const char *s = luaL_checklstring(L, 1, &ls);  const char *p = luaL_checklstring(L, 2, &lp);  size_t init = posrelat(luaL_optinteger(L, 3, 1), ls);  if (init < 1) init = 1;  else if (init > ls + 1) {  /* start after string's end? */    lua_pushnil(L);  /* cannot find anything */    return 1;  }  /* explicit request or no special characters? */  if (find && (lua_toboolean(L, 4) || nospecials(p, lp))) {    /* do a plain search */    const char *s2 = lmemfind(s + init - 1, ls - init + 1, p, lp);    if (s2) {      lua_pushinteger(L, s2 - s + 1);      lua_pushinteger(L, s2 - s + lp);      return 2;    }  }  else {    MatchState ms;    const char *s1 = s + init - 1;    int anchor = (*p == '^');    if (anchor) {      p++; lp--;  /* skip anchor character */    }    ms.L = L;    ms.src_init = s;    ms.src_end = s + ls;    ms.p_end = p + lp;    do {      const char *res;      ms.level = 0;      if ((res=match(&ms, s1, p)) != NULL) {        if (find) {          lua_pushinteger(L, s1 - s + 1);  /* start */          lua_pushinteger(L, res - s);   /* end */          return push_captures(&ms, NULL, 0) + 2;        }        else          return push_captures(&ms, s1, res);      }    } while (s1++ < ms.src_end && !anchor);  }  lua_pushnil(L);  /* not found */  return 1;}


函数有点长,不过这个很好理解,首先先对字符串进行检测是否合法,然后进行计算长度,以及从字符串中查找是否有要查找的字符串。并将个查找结果添加入lua_state中,然后通过弹出的方式返回给lua脚本编写的用户。这样我们就能很好的理解为什么lua可以返回多个函数值了。它把所有的返回值都放入栈中。然后在返回的时候依次的返回来,所以这不是什么神奇的东西,只是个语法糖o(∩_∩)o 哈哈。:-)

lua_pushinteger(L, s1 - s + 1); /* start */
lua_pushinteger(L, res - s); /* end */这两句你熟悉吗?若不熟悉请再将lua好好学习下吧。lua


呵呵,这样看来我可以说一句只要是图灵完全的语言都一样,什么语言都可以实现你想要的东西,只要你头脑清楚哈哈。编程范式和架构设计是关键。不过这里是lua讨论文章,请允许我废话几句。lua中的库其实都是c实现的,大家有心可以自己去实现,若能将两者结合,你会成为一个优秀的程序员和一枚强力的架构师。

原创粉丝点击