一步一步嚼懂Lua源码
文章平均质量分 75
Lua是一门脚本语言,容易上手,使用广泛,其精致而强大的源码是我们可以值得深入学习的内容,此专栏目标把Lua尽可能地简单通俗,图文并茂地解释其原理,仅限于交流探讨,如有错误请指正。
Kelvin7_Feng
Less is more
展开
-
Lua 源码分析之垃圾回收GC
Lua GC算法1.概览垃圾回收算法里,有两大类别:一是引用计数法,二是标记清除法(Mark & Sweep)。Lua 采用的是第二种,标记清除法。在不同的版本中,Lua的GC有不一样的做法。5.0版本的双色标记算法在早期的5.0版本使用的是双色标记清除法(Two-Color Mark and Sweep),它的大概原理是:每一个对象的状态非黑即白,要么被引用,要么没有被引用,系...原创 2020-02-11 15:24:05 · 1219 阅读 · 0 评论 -
Lua 源码分析之闭包Closure
闭包是Lua语言编程一个重要而又常用的概念。它主要作用是在函数离开作用域后还可以访问外部的临时变量,这些变量称为upvalue。 闭包分为两种,分别CClosure和LClosure。它们都被封装到一个Closure结构体里,CClosure和LClosure都有一个ClosureHeader的结构体。结构体ClosureHeader的字段作用: 1...原创 2019-04-11 19:29:44 · 998 阅读 · 0 评论 -
Lua 源码分析之Table - Rehash过程
Lua的Table的内存结构主要分array part和hash part,它们俩的内存大小是动态变化的,如果空间不够就需要分配更多的空间,如果空间利用率太少就需要缩减内存,这个过程叫做rehash。现在来看看rehash是怎么样的过程。rehash内部,主要是做了以下几件事: a.计算array part的key的数量 b.计算hash part的key的数量 c.计...原创 2019-04-01 15:44:24 · 2444 阅读 · 0 评论 -
Lua 源码分析之Table - Hash部分内部原理
Lua设计里面,Table是一个特别关键的部分。它可以表示很多的数据结构,可以是Array,可以是Map,可以根据自己的需要实现栈,队列等等,使用起来方便。源码里面的设计显得特别重要了,它是被很频繁地使用,提高性能是设计者重中之中。首先先看一下Lua的总体设计:它分为两部分,分别是数组Array和Hash部分。数组部分主要是存储下标从1开始的连续不为空的节点内容,如果是中间断开部分会存到has...原创 2019-03-15 20:05:01 · 7529 阅读 · 8 评论 -
Lua 源码分析之Table
一、创建一个table(lapi.c, line:666)LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { Table *t; lua_lock(L); luaC_checkGC(L); t = luaH_new(L); sethvalue(L, L->top, t); api...原创 2018-11-07 10:34:36 · 789 阅读 · 0 评论 -
Lua 源码分析之TValue
Lua数据结构设计确定了这个整体的设计理念,Lua所有的数据,一共有9种,都是通过TValue这个结构来存储。Lua的9种基础的数据类型有(lua.h:73):/*** basic types*/#define LUA_TNONE (-1)#define LUA_TNIL 0#define LUA_TBOOLEAN 1#define L...原创 2018-09-06 14:59:25 · 1798 阅读 · 0 评论 -
Lua 源码分析之String
因为每一版本的源码可能会有差别,现在基于lua 5.2.1来分析,保持一致性。从虚拟机的大体来看,字符串通过一个结构体存放在global_State里,这个结构stringtable(lstate.h)是:GCObject(lstate.h)的结构是:stringtable结构体的字段含义是:GCObject **hash:GCObject指针的指针,通过Hash值可以指...原创 2018-06-15 11:48:36 · 1389 阅读 · 0 评论