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实现的,大家有心可以自己去实现,若能将两者结合,你会成为一个优秀的程序员和一枚强力的架构师。
- Lua部分源代码分析(讨论lua的库是如何实现)
- Lua学习---lua源代码的分析顺序
- lua源码分析4(lua是怎么执行的)
- lua源代码文件分析
- lua源代码文件分析
- Lua源代码阅读(二)string的实现
- lua面向对象是怎么实现的
- lua面向对象是怎么实现的
- lua: tolua++实现分析
- LuaBit 对于LUA语言位操作符LUA语言实现,依赖于LUA Number的定义。(可参看未定义的实现部分)
- Java HashMap到底是如何实现的,结合源代码分析
- Lua源代码的阅读(三)table的实现
- Lua 阅读源代码的次序
- 【lua-cocos2dx游戏开发】Lua查找表元素过程(元表、__index方法是如何工作的)
- 【lua-cocos2dx游戏开发】Lua查找表元素过程(元表、__index方法是如何工作的)
- lua源码学习(二)lua的lapi.c实现
- 关于LUA源代码分析学习教程
- Lua5.1.4代码分析(二十三)-如何实现Lua代码的热更新
- void类型参数在C/C++中的不同
- C++拷贝构造函数(深拷贝,浅拷贝)
- 文件操作函数复习
- hadoop mr类图大纲
- Windows平台下下载android源码
- Lua部分源代码分析(讨论lua的库是如何实现)
- SRAM与DRAM区别
- android交叉编译工具链接下载
- 在Meego上实现一个播放器——总体设计
- c++中变量的存储位置及其作用域
- 做IT的与卖鞋买鞋的对比,欢乐一笑!
- 最大后验估计(MAP)
- Net-SNMP的mib2c
- SNMP AGNET 调试总结