Lua源码分析 - 基础篇 - Lua源码的结构和架构图(01)
目录
一、Lua语言简介
二、Lua架构图
三、Lua源码结构
很久很久没有写博客了,一直忙于工作和项目,最近依然想静下来阅读一些好的源码。自从读完了Nginx和Memcache的源码后,对服务器端的基础开源软件的实现原理有了一定的认识,接下来想看看Lua这门精巧的语言是如何实现的。
一、Lua语言简介
Lua是一门用C语言编写的脚本语言,一共1w多行代码,非常的轻巧,适合做web脚本、游戏脚本、物联网等场景下使用。
Lua可以进行独立编程,但是大部分情况下是嵌入到大型语言里面,作为一个库,成为一种脚本编程语言存在。
百度百科:Lua [1] 是一个小巧的脚本语言。它是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo三人所组成的研究小组于1993年开发的。 其设计目的是为了通过灵活嵌入应用程序中从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。所以Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的JIT项目,提供在特定平台上的即时编译功能。
Lua是解释型语言,通过对Lua的语言进行语法解析,然后生成二进制字节码,然后转由C语言进行执行操作。编译型语言,则会进行编译后生成机器码,直接由机器进行执行即可,执行效率会比较高。
二、Lua架构图
这个架构图,是整体读完了Lua的全部源码之后,才画出来的。如果有兴趣阅读Lua源码的同学,可以按照架构图的顺序,逐个模块进行学习。
三、Lua源码结构
Lua的下载地址:http://www.lua.org/
源码包下载后,我们可以看一下lua-5.3.5/src目录下的代码结构。代码结构基本会分3部分
虚拟机核心功能部分
文件 |
作用 |
lua.c |
lua的可执行入口 main函数 |
lapi.c | C语言接口 |
ldebug.c |
Debug 接口 |
ldo.c |
函数调用以及栈管理 |
lfunc.c |
函数原型及闭包管理 |
lgc.c |
垃圾回收机制 |
lmem.c |
内存管理接口 |
lobject.c |
对象操作函数 |
lopcodes.c |
虚拟机字节码定义 |
lstate.c |
全局状态机 管理全局信息 |
lstring.c |
字符串池 |
ltable.c |
表类型的相关操作 |
ltm.c |
元方法 |
lvm.c |
虚拟机 |
lzio.c |
输入流接口 |
源代码解析和预编译
文件 | 作用 |
lcode.c |
代码生成器 |
ldump.c |
序列化预编译的Lua 字节码 |
llex.c |
词法分析器 |
lparser.c |
解析器 |
lundump.c |
还原预编译的字节码 |
内嵌库
文件 | 作用 |
lauxlib.c |
库编写用到的辅助函数库 |
lbaselib.c |
基础库 |
ldblib.c |
Debug 库 |
linit.c |
内嵌库的初始化 |
liolib.c |
IO 库 |
lmathlib.c |
数学库 |
loadlib.c |
动态扩展库管理 |
loslib.c |
OS 库 |
lstrlib.c |
字符串库 |
ltablib.c |
表处理库 |
每次阅读源码,其实最难的是开始,通过网上各种资料,先把lua的整个目录结构弄明白,幸好lua真的比较小,很容易就能弄明白每个文件是干什么的。接下去就是开始一点一点的啃整个源码的过程了。
啃整个lua语言链路解析过程之前,我会优先把lua周边的库以及虚拟机字节码这块搞明白,然后再开始进行整个解析流程的阅读。
Lua源码分析 - 基础篇 - Lua源码的结构和架构图(01)相关推荐
- 【源码解读】Screencap源码分析-基础篇
本文期望达到的目的: 了解screencap使用 了解screencap实现基础原理 为后续screencap源码修改和其他应用做准备 源码位置: android4.0之后内置了截图工具screenc ...
- 鸿蒙内核源码分析表,鸿蒙内核源码分析(双向链表篇) | 谁是内核最重要结构体 ? | 开篇致敬鸿蒙内核开发者 | v1.10...
谁是鸿蒙内核最重要的结构体? 答案一定是: LOS_DL_LIST(双向链表),它长这样.typedef struct LOS_DL_LIST {//双向链表,内核最重要结构体 struct LOS_ ...
- Lua源码分析 - 虚拟机篇 - 语义解析之Opcode执行(18)
目录 一.虚拟机篇 - 指令执行状态机luaV_execute 二.虚拟机篇 - 状态机的具体实现原理 一.虚拟机篇 - 指令执行状态机luaV_execute 在<Lua源码分析 - 主流程篇 ...
- Nginx实战基础篇一 源码包编译安装部署web服务器
Nginx实战基础篇一 源码包编译安装部署web服务器 版权声明: 本文遵循"署名非商业性使用相同方式共享 2.5 中国大陆"协议 您可以自由复制.发行.展览.表演.放映.广播或通 ...
- asp.net mvc源码分析-Action篇 Action的执行
接着上篇 asp.net mvc源码分析-Action篇 DefaultModelBinder 我们已经获取的了Action的参数,有前面的内容我们知道Action的调用时在ControllerAct ...
- asp.net mvc源码分析-Action篇 DefaultModelBinder
接着上篇 asp.net mvc源码分析-Controller篇 ValueProvider 现在我们来看看ModelBindingContext这个对象. ModelBindingContext b ...
- jedis的源码理解-基础篇
[jedis的源码理解-基础篇][http://my.oschina.net/u/944165/blog/127998] (关注实现关键功能的类) 基于jedis 2.2.0-SNAPSHOT 首先是 ...
- asp.net mvc源码分析-Controllerl篇 ControllerDescriptor
在上篇asp.net mvc源码分析-Controllerl篇 TempData数据存储 我们讲到了ActionInvoker.InvokeAction(ControllerContext, acti ...
- Nginx基础篇-Nginx 源码编译安装与平滑升级
Nginx基础篇-Nginx 源码编译安装与平滑升级 Nginx官网下载地址 http://nginx.org/ 1.安装依赖包 yum -y install pcre-devel zlib-deve ...
最新文章
- Docker 搭建elasticsearch 7.6.x集群
- switch的case使用数组C语言,使用常量数组的元素作为switch语句中的case
- linux-centos7-yum安装mcrypt**
- CCS5.5 中报错 Does not match the target type,not loaded 的一种情况
- ServerBootstrap的启动流程
- 18.IDA-创建自己的sig(创建自己的标签)
- html file对象修改,HTML DOM
- 成功运行官方Tensorflow Android的demo的过程
- 《编写有效用例》阅读笔记04
- 如何设置mysql字符集支持utf-8 和gbk_mysql建表的时候设置表里面的字段的字符集是utf-8要怎么设置?默认建好后我去mysql里看字符集都是gbk...
- 前后端分离之后,如何保护你的API
- 【2018年12月04日】钢铁行业的估值高度排名
- 摄影测量空间后方交会python实现
- IDEA配置JAVA11
- 第一章 如何学习单片机
- 2018再见|2019你好
- Linux命令英文全称
- java用于选择结构的关键字_Java结构
- win10开机蓝屏_终级解决win10蓝屏代码WHEA_UNCORRECTABLE_ERROR没有之一 心语家园
- 昨天睡眠质量记录70分
热门文章
- 一篇文章搞定百度OCR图片文字识别API
- Java Error(三)
- Codeforces 766E Mahmoud and a xor trip(树形DP)
- linux下Intellij Idea 14的安装
- Nslookup-查dns
- [译] APT分析报告:10.Lazarus以ThreatNeedle家族攻击工业事件还原(BMP图片隐藏RAT)
- 【数据结构与算法】之深入解析“最长连续序列”的求解思路与算法示例
- 对于一颗具有n个结点,度为4的树来说,( )
- 最长公共子序列Lcs 51Nod - 1006
- 126. Word Ladder II