目录

  • 一、什么是lua
  • 二、lua源代码结构
  • 三、阅读lua源代码顺序

一、什么是lua

1、lua是用C编写的脚本语言,可以在web、游戏、物联网等场景下使用,源代码共1万多行;可以独立编程,可以嵌入到其他语言里面作为一个库使用,从而为应用程序提供灵活的扩展和定制功能。

2、lua官方源码下载网址:http://www.lua.org/

二、lua源代码结构

1、lua语言结构图

2、lua源代码都放在src文件夹下,源码分为四部分

第一部分:虚拟机运转的核心功能

lapi.c     C语言接口
lctype.c   C标准库中ctype相关实现
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     输入流接口

说明:

lua核心部分仅包括lua虚拟机的运转。
(1)lopcodes.c控制了lua虚拟机的行为
(2)lvm.c定义了虚拟机对opcode的解析和运作,API以luaV为前缀
(3)lstate.c,lua虚拟机的外在数据形式是一个lua_State结构体,描述了lua虚拟机当前的状态,全局State引用了整个虚拟机的所有数据,API以luaE为前缀。
(4)ldo.c定义了函数的调用即返回,相关API以luaD为前缀
(5)lua最复杂也最重要的三种数据类型是function、table、string,他们的实现定义在lfunc.c、ltable.c、lstring.c中,三组内部API分别以luaF、luaH、luaS为前缀命名,不同的数据类型被统一定义在lobject.c中,API以luaO为前缀。
(6)ltm.c定义了元表的处理,API以luaT为前缀
(7)核心系统还用到了两个基础设备:内存管理lmem.c,API以luaM为前缀;带缓冲的流处理lzio.c,API以luaZ为前缀。
(8)lgc.c定义了垃圾回收机制,也是核心系统里最为复杂的部分,API以luaC为前缀。
(9)lapi.c, lua是一门嵌入式语言,可以和宿主机系统相结合。所以必须提供和宿主机系统交互的API,这些API以C函数的形式提供,在lapi.c中实现,API直接以lua为前缀。

第二部分:源代码解析及预编译字节码

lcode.c    代码生成器
ldump.c    序列化预编译的lua字节码
llex.c     词法分析器
lparser.c  解析器
lundump.c  还原预编译的字节码

说明:

只有核心代码和一个虚拟机还不能让lua程序运行起来,还需要有外部输入经过解析才可以运行起来。
(1)lparser.c、llex.c,外部输入的文本程序代码需要经过解析得到内部的数据结构(常量opcode的集合),这个过程通过lparser.c完成,API前缀为luaY,这个过程还需要通过词法分析llex.c完成,API前缀为luaX。
(2)lcode.c,解析完外部文本代码,还需要最终生成虚拟机理解的数据,这个步骤在lcode.c中完成,API前缀为luaK。
(3)ldump.c、lundump.c,为了加快代码翻译的流程,可以采用预编译的过程,把运行时编译的结果生成字节码,这个过程以及逆过程由ldump.c和lundump.c完成,API前缀为luaU。

第三部分:内嵌库

lauxlib.c    库编写用到的辅助函数库
lbaselib.c   基础库
lbitlib.c    位操作库
lcorolib.c   协程库
ldblib.c     debug库
linit.c      内嵌库的初始化
liolib.c     IO库
lmathlib.c   数学库
loadlib.c    动态扩展库管理
loslib.c     OS库
lstrlib.c    字符串库
ltablib.c    表处理库

说明:

嵌入式语言可以不提供库及函数,全部由宿主系统注入到State中即可,但是lua官方版本提供了少量的库,
比如一些基础函数,如pairs、error、setmetatable、type等。lua允许自由加载需要的部分,以控制最终
执行文件的体积和内存的占用量。
(1)lualib.h,主动加载这些内嵌库进入lua_State是在lualib.h中的API实现。
(2)loadlib.c、limit.c:在lua 5.0之前,lua并没有统一的模块管理机制,因为早期lua定位是嵌入式语言,后来人们
倾向于把lua作为一门独立的编程语言来使用,那么统一的模块化管理就变得很由必要,这样才能让丰富的第三方库可以
协同工作。在lua 5.1引入了官方推介的模块管理机制,require、module,并允许从C语言编写的动态库中加载模块,
在lua 5.2做了简化。我们可以在loadlib.c中找到实现,内嵌库的初始化API则在limit.c中找到。
(3)lib.c,其他的基础库在lib.c为后缀的文件中实现。

第四部分:可执行的解析器,字节码编译器

lua.c  解释器
luac.c 字节码编译器

说明:

早期lua主要在嵌入式系统中使用,所以源代码通常被编译成动态库或静态库被宿主机系统加载或链接,
但随着lua第三方库越来越丰富,人们开始把lua作为一门独立的语言来使用,lua的官方版本里提供了
一个单独的解析器,在lua.c中实现,luac.c实现了一个简单的字节码编译器,可以预编译文本的lua源程序。

三、阅读lua源代码顺序

lua源码设计精简、优雅、易读,在阅读之前理清代码的设计脉络很重要。推荐的阅读顺序是:

  1. 首先,阅读外围的库是如何实现功能扩展,这样可以熟悉lua的公开API,不陷入功能细节;

  2. 然后,阅读API的具体实现,lua对外暴露的API是对内部模块的一层封装,可以对核心代码有个初步的了解;

  3. 其次,阅读lua VM的实现、函数调用、返回、string、metatable等实现;

  4. 再次,阅读debug模式(一个额外的设施),帮助你理解lua内部细节;

  5. 最后,阅读parser等编译相关的部分、垃圾收集(最难部分)

lua源代码分析01:lua源代码结构分析相关推荐

  1. avclient安装_反病毒软件clamAV源代码分析 01 - 安装编译

    最近发现网上有个开源的反病毒软件clamwin,官方地址是http://www.clamwin.com/,下个最新版本试下先. 据介绍这只是个UI壳,用Python/ wxPython写的,其实用的是 ...

  2. linux源代码分析视频教程,linux源代码分析方法谈

    Linux的最大的好处之一就是它的源码公开.同时,公开的核心源码也吸引着无数的电脑爱好者和程序员:他们把解读和分析Linux的核心源码作为自己的最大兴趣,把修改Linux源码和改造Linux系统作为自 ...

  3. SDL2源代码分析7:显示(SDL_RenderPresent())

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  4. SDL2源代码分析6:复制到渲染器(SDL_RenderCopy())

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  5. SDL2源代码分析5:更新纹理(SDL_UpdateTexture())

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  6. SDL2源代码分析4:纹理(SDL_Texture)

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  7. SDL2源代码分析2:窗口(SDL_Window)

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  8. SDL2源代码分析5 更新纹理(SDL UpdateTexture )

    ===================================================== SDL源代码分析系列文章列表: SDL2源代码分析1:初始化(SDL_Init()) SDL ...

  9. Mysql源代码分析系列

    Mysql源代码分析系列(2): 源代码结构 Mysql源代码主要包括客户端程序代码,服务器端代码,测试工具和一些库构成,下面我们对比较重要的目录做些介绍. BUILD 这个目录在本系列的上篇文章中我 ...

最新文章

  1. Error in **: incorrect number of subscripts on matrix
  2. Hadoop-2.7.4 八节点分布式集群安装
  3. 微软私有云分享(R2)16PowerShell查看虚拟机信息
  4. 微信公共平台接口开发--Java实现
  5. android加法服务类,iOS越来越像Android:苹果简单做加法远离精致
  6. Java String indexOf(String substr,int fromIndex)方法,带示例
  7. (127)FPGA面试题-介绍FPGA 门控时钟
  8. 软件测试中不需要测试的八件事
  9. luogu P5290 [十二省联考2019]春节十二响 优先队列 + 启发式合并
  10. vue style.css,vue * !!vue-style-loader!css-loader?
  11. 信号与系统与数字信号处理丹梅老师公众号笔记
  12. 蓝桥杯官网练习系统基础练习(八)
  13. 太极团队首发:iOS 8.3完美越狱工具发布
  14. 黑php的称呼,这三个称呼你都说对了吗?
  15. 神仙打架!清华公布2020特奖候选人名单,有人三篇顶会一作!还有人...
  16. 那些年我用过的app爬虫常用抓包软件
  17. mulesoft 入门与实践-1
  18. 电路+模电+电力电子基础
  19. 深度强化学习DQN网络
  20. 6款强烈推荐的 SD卡/内存卡数据恢复软件

热门文章

  1. 指针数组 与 数组指针 的分析
  2. 2016年第七届蓝桥杯javaB组 试题 答案 解析
  3. 702:Crossing River (贪心)
  4. java day01第一课java简介
  5. iOS深入探索直播推拉流实现流程(二:推流权限判断 )
  6. 病毒软件,导致DNS失效的解决办法
  7. [译] 新手和老手都将受益的JavaScript小技巧
  8. Matlab GUI 设计(4):不同控件之间的数据传递
  9. 操作系统(Linux与Windows)的进程管理
  10. 前端JS: 通过代码-看函数作用域this对象