Lua源码学习
文章平均质量分 90
https://github.com/shankusu2017/lua
联系方式:微信(qq3055867734)
shankusu2017
go lua c 服务器开发 shankusu2017.github.io
展开
-
Lua代码建议的阅读顺序
以下内容转载自https://www.reddit.com/comments/63hth/ask_reddit_which_oss_codebases_out_there_are_so/c02pxbpRecommended reading order: lmathlib.c, lstrlib.c: get familiar with the external C API. Do...转载 2018-09-04 11:19:49 · 860 阅读 · 0 评论 -
云风 Lua GC 的源码剖析 (6) 完结
GC 中最繁杂的 mark 部分已经谈完了。剩下的东西很简单。今天一次可以写完。sweep 分两个步骤,一个是清理字符串,另一个是清理其它对象。看代码,lgc.c 573 行: case GCSsweepstring: { lu_mem old = g->totalbytes; sweepwholelist(L, &g->strt.hash[g->sweepstrgc++]); if (g->sweepstrgc >= g转载 2021-03-14 16:52:09 · 453 阅读 · 0 评论 -
探索Lua5.2内部实现:Garbage Collection(3)
以下内容转载自https://blog.csdn.net/yuanlin2008/article/details/8772190GC步骤global_State中的gcstate记录了当前incremental gc的执行状态。根据执行状态,整个gc过程被分为很多步执行。GCSpauseGCSpause状态标志着当前没有开始gc。gc一旦开始,第一步要做的就是标识所有的root对象。root对象包括global_State引用的mainthread对象,registry table,全局的met.转载 2021-03-10 22:42:00 · 117 阅读 · 0 评论 -
探索Lua5.2内部实现:Garbage Collection(2)
以下内容转载自https://blog.csdn.net/yuanlin2008/article/details/8684869GCObjectLua使用union GCObject来表示所有的垃圾回收对象:182 /*183 ** Union of all collectable objects184 */185 union GCObject {186 GCheader gch; /* common header */187 union TString ts;188 ...转载 2021-03-10 13:27:32 · 128 阅读 · 0 评论 -
探索Lua5.2内部实现:Garbage Collection(1) 原理
以下内容转载自https://blog.csdn.net/yuanlin2008/article/details/8558103Lua5.2采用垃圾回收机制对所有的lua对象(GCObject)进行管理。Lua虚拟机会定期运行GC,释放掉已经不再被被引用到的lua对象。基本算法基本的垃圾回收算法被称为"mark-and-sweep"算法。算法本身其实很简单。首先,系统管理着所有已经创建了的对象。每个对象都有对其他对象的引用。root集合代表着已知的系统级别的对象引用。我们从root集合出发,.转载 2021-03-10 13:02:23 · 157 阅读 · 0 评论 -
Lua的function、closure和upvalue
以下内容转载自https://blog.csdn.net/soloist/article/details/319214Lua中的函数是一阶类型值(first-class value),定义函数就象创建普通类型值一样(只不过函数类型值的数据主要是一条条指令而已),所以在函数体中仍然可以定义函数。假设函数f2定义在函数f1中,那么就称f2为f1的内嵌(inner)函数,f1为f2的外包(enclosing)函数,外包和内嵌都具有传递性,即f2的内嵌必然是f1的内嵌,而f1的外包也一定是f2的外包。内嵌函数.转载 2021-02-23 10:35:06 · 240 阅读 · 0 评论 -
构建Lua解释器Part9:metatable
以下内容转载自http://manistein.club/post/program/let-us-build-a-lua-interpreter/%E6%9E%84%E5%BB%BAlua%E8%A7%A3%E9%87%8A%E5%99%A8part9/前言本章,我们将进入到metatable的探索之中。由于这块本身比较简单,而且我也不打算罗列代码细节,因此本章的篇幅不会很大。只是对一些我认为比较关键的部分,进行说明。首先,本章的主要任务,首先是简要介绍metatable是做什么的...转载 2021-02-15 20:24:55 · 205 阅读 · 0 评论 -
构建Lua解释器Part8:构建完整的语法分析器(下)
以下内容转载自http://manistein.club/post/program/let-us-build-a-lua-interpreter/%E6%9E%84%E5%BB%BAlua%E8%A7%A3%E9%87%8A%E5%99%A8part8/前言前面,我已经用3篇blog的巨大篇幅,详细论述了Lua编译模块的一些基本知识。其中,Part5通过一个简单的打印hello world的例子,论述了编译出来的虚拟机指令,如何存到Proto结构中,最后再通过虚拟机执行的流程。Pa...转载 2021-02-15 20:15:04 · 798 阅读 · 0 评论 -
构建Lua解释器Part7:构建完整的语法分析器(上)
以下内容转载自http://manistein.club/post/program/let-us-build-a-lua-interpreter/%E6%9E%84%E5%BB%BAlua%E8%A7%A3%E9%87%8A%E5%99%A8part7/在上一章里,我完成了词法分析器的设计与实现的论述,接下来我要继续论述语法分析器的设计与实现。限于篇幅,我将会把语法分析器分为两个部分来论述,本章为上部,下一章为下部。本章将会重新复习编译器的构造,并且论述编译流程,以及lua的parser所涉及的编...转载 2021-02-15 20:11:03 · 991 阅读 · 0 评论 -
构建Lua解释器Part6:词法分析器设计与实现
以下内容转载自http://manistein.club/post/program/let-us-build-a-lua-interpreter/%E6%9E%84%E5%BB%BAlua%E8%A7%A3%E9%87%8A%E5%99%A8part6/构建Lua解释器Part5,对Lua解释器进行了整体介绍,并且以一个hello world程序为例子,给读者一个初步的概念。通过那一篇,我们知道了编译器至少要包括词法分析其和语法分析器,而本篇,我将集中时间和精力,用来介绍和讲解Lua词法分析器的设计与.转载 2021-02-15 20:06:00 · 690 阅读 · 0 评论 -
构建Lua解释器Part5:脚本运行基础架构的设计与实现
以下内容转载自http://manistein.club/post/program/let-us-build-a-lua-interpreter/%E6%9E%84%E5%BB%BAlua%E8%A7%A3%E9%87%8A%E5%99%A8part5/前言在经过漫长的准备,我终于完成了《构建Lua解释器》系列的第五部分的代码编写,并且通过了预定的测试。本篇我将对dummylua项目中的脚本运行基础架构的设计与实现进行介绍和解析,它包括了lua编译器基础架构以及虚拟机基础架构。过去...转载 2021-02-15 19:59:10 · 674 阅读 · 0 评论 -
构建Lua解释器Part4:Table设计与实现
以下内容转载自http://manistein.club/post/program/let-us-build-a-lua-interpreter/%E6%9E%84%E5%BB%BAlua%E8%A7%A3%E9%87%8A%E5%99%A8part4/前言本篇我将对dummylua中Table的设计和实现进行介绍和说明。本文的目的旨在梳理清dummylua项目Table的数据结构和运作流程,该部分深度参考了lua-5.3.4的Table设计与实现,由于所有的细节是我自己根据理解重...转载 2021-02-15 15:33:46 · 371 阅读 · 0 评论 -
构建Lua解释器Part3:String设计与实现
以下内容转载自http://manistein.club/post/program/let-us-build-a-lua-interpreter/%E6%9E%84%E5%BB%BAlua%E8%A7%A3%E9%87%8A%E5%99%A8part3/前言上一章节我介绍了dummylua项目的gc的设计原理和实现方式,该部分我基本是仿造了官方lua-5.3.4的做法。本章节,我将为大家带来dummylua项目TString的设计实现讲解。和以往任何一篇一样,本篇我也是基本遵循...转载 2021-02-15 15:32:06 · 343 阅读 · 0 评论 -
构建Lua解释器Part2:Garbage Collection基础架构
以下内容转载自http://manistein.club/post/program/let-us-build-a-lua-interpreter/%E6%9E%84%E5%BB%BAlua%E8%A7%A3%E9%87%8A%E5%99%A8part2/前言上一篇我已经设计和实现了Lua解释器最基础的基本数据结构,实现了纯C函数在栈中的调用流程,以及保护模式调用函数等内容,今天要介绍的则是Lua解释器的GC基础架构。Garbage Collection机制,可能是让人们听之不寒而栗...转载 2021-02-15 15:30:32 · 237 阅读 · 0 评论 -
构建Lua解释器Part1:虚拟机的基础--Lua基本数据结构、栈和基于栈的C函数调用的设计与实现
以下内容转载自http://manistein.club/post/program/let-us-build-a-lua-interpreter/%E6%9E%84%E5%BB%BAlua%E8%A7%A3%E9%87%8A%E5%99%A8part1/前言从本篇开始,我们正式进入到Lua解释器的开发阶段(这是一个遵循Lua5.3标准的项目)。本篇并不直接接入到设计和实现语法分析器和词法分析器的阶段,而是先设计和实现Lua虚拟机的基础数据结构(包括Lua最基本的数据结构,如基本数据...转载 2021-02-15 15:29:24 · 691 阅读 · 0 评论 -
Lua源码阅读-lmath.c
/*** This function uses 'double' (instead of 'lua_Number') to ensure that** all bits from 'l_rand' can be represented, and that 'RANDMAX + 1.0'** will keep full precision (ensuring that 'r' is alwa...原创 2020-01-09 23:21:19 · 449 阅读 · 0 评论 -
万字详文:深入理解 Lua 虚拟机- Lua 指令集详解
以下内容转载自https://www.toutiao.com/i6841096835029795336/原创腾讯技术工程2020-06-22 18:04:55本文从一个简单示例入手,详细讲解 Lua 字节码文件的存储结构及各字段含义,进而引出 Lua 虚拟机指令集和运行时的核心数据结构 Lua State,最后解释 Lua 虚拟机的 47 条指令如何在 Lua State 上运作的。为了达到较高的执行效率,lua 代码并不是直接被 Lua 解释器解释执行,而是会先编译为字节码,然后再..转载 2021-02-14 21:57:20 · 3086 阅读 · 0 评论 -
C4:4个函数,528行代码实现可自举的 C语言编译器
以下内容转载自https://www.toutiao.com/i6831502722718499340/引言自从华为方舟编译器横空出世,一举成为全民网红之后,一下子点燃了大家对编译器的热情。不过,对于大多数人来说,编译器仍然是遥不可及的神秘存在。今天,介绍一个国外大牛写的C语言编译器 - C4,揭开编译器的神秘面纱。原来实现一个具备基本功能的编译器,竟是如此简单!C4:4个函数实现的C语言编译器C4, C in four functions。它是一个C语言编译器项目(项目地址在文末.转载 2021-02-09 12:47:26 · 3289 阅读 · 0 评论 -
探索Lua5.2内部实现:编译系统(4) 表达式分类
以下内容转载自https://blog.csdn.net/yuanlin2008/article/details/8534583常量表达式常量表达式在Lua用来表示"nil",“true”,“false”,字符串和数字的值。在BNF中常量表达式属于终结符,也就是语法解析的最底端,在simpleexp函数中被解析出来,并创建对应类型的expdesc对象。VNIL,VTRUE和VFALSE这三个类型本身就对应3个固定的值,没有什么额外的数据。VKNUM类型代表数字常量,需要在nval中存放从词法分析中转载 2020-07-09 10:59:24 · 387 阅读 · 0 评论 -
风云lua分析-Lua GC 的源码剖析 (5)
已下内容转载自https://blog.codingnow.com/2011/03/lua_gc_5.html今天来说说 write barrier 。在 GC 的扫描过程中,由于分步执行,难免会出现少描了一半时,那些已经被置黑的对象又被修改,需要重新标记的情况。这就需要在改写对象时,建立 write barrier 。在扫描过程中触发 write barrier 的操作影响的对象被正确染色,或是把需要再染色的对象记录下来,留到 mark 的最后阶段 atomic 完成。和 barri.转载 2020-07-09 10:21:48 · 411 阅读 · 0 评论 -
风云lua分析-Lua GC 的源码剖析 (4)
以下内容转载自https://blog.codingnow.com/2011/03/lua_gc_4.html今天来看一下 mark 过程是怎样实现的。所有的 GC 流程,都从 singlestep 函数开始。singlestep 就是一个最简单的状态机。GC 状态简单的从一个状态切换到下一个状态,循环不止。状态标识放在 global state 的 gcstate 域中。这一点前面谈过。开始的两个状态和 mark 过程有关。初始的 GCSpause 状态下,执行 markroot 函数转载 2020-07-09 10:20:04 · 410 阅读 · 0 评论 -
风云lua分析-Lua GC 的源码剖析 (3)
以下内容转载自https://blog.codingnow.com/2011/03/lua_gc_3.html有了前几天的基础,我们可以从顶向下来读 lua gc 部分的代码了。我们知道,lua 对外的 API 中,一切个 gc 打交道的都通过lua_gc。C 语言构建系统时,一般不讲设计模式。但模式还是存在的。若要按《设计模式》中的分类,这应该归于 Facade 模式。代码在 lapi.c 的 895 行:/* ** Garbage-collection function */ LUA..转载 2020-07-09 10:17:49 · 619 阅读 · 0 评论 -
风云lua分析-Lua GC 的源码剖析 (2)
以下内容转载自https://blog.codingnow.com/2011/03/lua_gc_2.html早期的 Lua GC 采用的是 stop the world 的实现。一旦发生 gc 就需要等待整个 gc 流程走完。如果你用 lua 处理较少量数据,或是数据增删不频繁,这样做不是问题。但当处理的数据量变大时,对于实时性要求较高的应用,比如网络游戏服务器,这个代价则是不可忽略的。lua 本身是个很精简的系统,但不代表处理的数据量也一定很小。从 Lua 5.1 开始,GC 的实现改为分步转载 2020-07-09 10:16:55 · 476 阅读 · 0 评论 -
风云lua分析-Lua GC 的源码剖析 (1)
以下内容转载自https://blog.codingnow.com/2011/03/lua_gc_1.html最近发现在大数据量的 lua 环境中,GC 占据了很多的 CPU 。差不多是整个 CPU 时间的 20% 左右。希望着手改进。这样,必须先对 lua 的 gc 算法极其实现有一个详尽的理解。我之前读过 lua 的源代码,由于 lua 源码版本变迁,这个工作还需要再做一次。这次我重新阅读了 lua 5.1.4 的源代码。从今天起,做一个笔记,详细分析一下 lua 的 gc 是如何实现的。阅读代转载 2020-07-09 10:15:46 · 608 阅读 · 0 评论 -
Lua源码学习-lparser.c
/*** $Id: lparser.c,v 2.149 2015/11/02 16:09:30 roberto Exp $** Lua Parser** See Copyright Notice in lua.h*//*** 本源文件中函数返回类型: l_noret funName(...),** void funName(...), 两者的差异?**** Lua完整的BNF**** chunk ::= block*...原创 2020-07-06 12:53:56 · 616 阅读 · 0 评论 -
Lua源码学习-lparser.h
/*** $Id: lparser.h,v 1.74 2014/10/25 11:50:46 roberto Exp $** Lua Parser** See Copyright Notice in lua.h*/#ifndef lparser_h#define lparser_h#include "llimits.h"#include "lobject.h"#include "lzio.h"/*** Expression descriptor 表达式描述符*/typed原创 2020-07-06 12:53:04 · 194 阅读 · 0 评论 -
Lua源码学习-lcode.c
/*** $Id: lcode.c,v 2.103 2015/11/19 19:16:22 roberto Exp $** Code generator for Lua** See Copyright Notice in lua.h*/#define lcode_c#define LUA_CORE#include "lprefix.h"#include <math.h>#include <stdlib.h>#include "lua.h"#inclu原创 2020-07-06 12:51:48 · 689 阅读 · 0 评论 -
Lua的演进,历史
lua的优点:可移植性 容易嵌入 体积小 高效率这些优点都来自于lua的设计目标:简洁。从Scheme获得了很多灵感,包括匿名函数,合理的语义域概念3 lua前身巴西被商贸限制,引入计算机软件和硬件受限,巴西人有强烈的民族情绪去创造自己的软件。三名作者都是同一个实验室Tecgraf的,这个实验室与很多工业实体有合作关系。成立的头十年,重点是创造交互性的图形软件,帮助合作伙伴进行设计。巴西石油公司是其中一个重要伙伴。有大量的遗留数据需要处理。于是诞生了DEL,一个领域专用语言,主要用来描述转载 2020-07-03 09:07:32 · 2373 阅读 · 0 评论 -
Lua源码学习-lstring.h
/*** $Id: lstring.h,v 1.61 2015/11/03 15:36:01 roberto Exp $** String table (keep all strings handled by Lua)** See Copyright Notice in lua.h*/#ifndef lstring_h#define lstring_h#include "lgc.h"#include "lobject.h"#include "lstate.h"/* 这里的+1:给结原创 2020-06-28 14:32:59 · 244 阅读 · 0 评论 -
Lua源码学习-lstate.c
/*** $Id: lstate.c,v 2.133 2015/11/13 12:16:51 roberto Exp $** Global State** See Copyright Notice in lua.h*/#define lstate_c#define LUA_CORE#include "lprefix.h"#include <stddef.h>#include <string.h>#include "lua.h"#include "la原创 2020-06-28 14:31:45 · 362 阅读 · 0 评论 -
Lua源码学习-lmem.c
/*** $Id: lmem.c,v 1.91 2015/03/06 19:45:54 roberto Exp $** Interface to Memory Manager** See Copyright Notice in lua.h*/#define lmem_c#define LUA_CORE#include "lprefix.h"#include <stddef.h>#include "lua.h"#include "ldebug.h"#include原创 2020-06-27 15:28:57 · 414 阅读 · 0 评论 -
Lua源码学习-ltablib.h
/*** $Id: lctype.h,v 1.12 2011/07/15 12:50:29 roberto Exp $** 'ctype' functions for Lua** See Copyright Notice in lua.h*/#ifndef lctype_h#define lctype_h#include "lua.h"/*** WARNING: the functions defined here do not necessarily correspond**原创 2020-06-27 15:25:56 · 203 阅读 · 0 评论 -
Lua源码学习-lctype.c
/*** $Id: lctype.c,v 1.12 2014/11/02 19:19:04 roberto Exp $** 'ctype' functions for Lua** See Copyright Notice in lua.h*/#define lctype_c#define LUA_CORE#include "lprefix.h"#include "lctype.h"#if !LUA_USE_CTYPE /* { */#include <limits...原创 2020-06-27 15:25:22 · 176 阅读 · 0 评论 -
Lua源码学习-lgc.h
/*** $Id: lgc.h,v 2.90 2015/10/21 18:15:15 roberto Exp $** Garbage Collector** See Copyright Notice in lua.h*//*** 网上其它介绍: https://blog.codingnow.com/2011/03/lua_gc_1.html*/#ifndef lgc_h#define lgc_h#include "lobject.h"#include "lstate.h"/原创 2020-06-27 14:29:47 · 219 阅读 · 0 评论 -
Lua源码学习-lgc.c
/*** $Id: lgc.c,v 2.210 2015/11/03 18:10:44 roberto Exp $** Garbage Collector** See Copyright Notice in lua.h*/#define lgc_c#define LUA_CORE#include "lprefix.h"#include <string.h>#include "lua.h"#include "ldebug.h"#include "ldo.h"#i原创 2020-06-27 14:28:50 · 414 阅读 · 0 评论 -
Lua源码学习-lstring.c
/*** $Id: lstring.c,v 2.56 2015/11/23 11:32:51 roberto Exp $** String table (keeps all strings handled by Lua)** See Copyright Notice in lua.h*/#define lstring_c#define LUA_CORE#include "lprefix.h"#include <string.h>#include "lua.h"#i原创 2020-06-27 14:26:58 · 227 阅读 · 0 评论 -
Lua源码学习-ltablib.c
/*** $Id: ltablib.c,v 1.90 2015/11/25 12:48:57 roberto Exp $** Library for Table Manipulation** See Copyright Notice in lua.h*/#define ltablib_c#define LUA_LIB#include "lprefix.h"#include <limits.h>#include <stddef.h>#include <原创 2020-06-27 14:24:36 · 378 阅读 · 0 评论 -
Lua源码学习-lmathlib.c
/*** $Id: lmathlib.c,v 1.117 2015/10/02 15:39:23 roberto Exp $** Standard mathematical library** See Copyright Notice in lua.h**** 少数函数自己实现(主要是为了兼容lua中的number可能int64而数学库中的函数可能仅能处理bit32的情况),* 大部分直接调用C的math库。*/#define lmathlib_c#define LUA_LIB#.原创 2020-06-27 14:20:33 · 211 阅读 · 0 评论 -
Lua源码学习-lauxlib.c
/*** $Id: lauxlib.c,v 1.284 2015/11/19 19:16:22 roberto Exp $** Auxiliary functions for building Lua libraries** See Copyright Notice in lua.h*/#define lauxlib_c#define LUA_LIB#include "lprefix.h"#include <errno.h>#include <stdarg.h&g原创 2020-06-27 14:16:12 · 749 阅读 · 0 评论 -
Lua源码学习-lauxlib.h
/*** $Id: lauxlib.h,v 1.129 2015/11/23 11:29:43 roberto Exp $** Auxiliary functions for building Lua libraries** See Copyright Notice in lua.h*/#ifndef lauxlib_h#define lauxlib_h#include <stddef.h>#include <stdio.h>#include "lua.h原创 2020-06-27 10:12:10 · 772 阅读 · 0 评论