Lua源码分析 - 基础篇 - Lua源码的结构和架构图(01)

Lua源码分析(3) -- 虚拟机 Lua首先将源程序编译成为字节码,然后交由虚拟机解释执行.对于每一个函数,Lua的编译器将创建一个原型(prototype),它由一组指令及其使用到的常量组成[1].最初的Lua虚拟机是基于栈的.到1993年,Lua5.0版本,采用了基于寄存器的虚拟机,使得Lua的解释效率得到提升,体系结构与指令系统 与虚拟机和指令相关的文件主要有两个: lopcodes.c 和 lvm.c. 从名称可以 阅读详情
AI摘要

本文深入介绍了Lua语言的特点,包括其轻巧的特性、适合的场景以及如何嵌入到其他语言中作为脚本语言使用。文章详细阐述了Lua的架构图、源码结构,并对Lua的虚拟机核心功能、源代码解析和预编译、内嵌库进行了全面的解读。

目录

一、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.cC语言接口

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源码。相关的文章有很多,其中就有云风未完成的《Lua源码鉴赏》,以及《Lua GC 的源码剖析》,也是我阅读源码过程中的重要参考。“纸上得来终觉浅,绝知此事要躬行”,于是开一个专栏,专门记录此间的心得。 lua版本是5.1.5,(⊙o⊙)…我们项目里实际上使用的是luajit-2.1(⊙o⊙)…莫名的觉得在读luajit之前应当先读一下对应的原生lua版本,于是就走上 阅读详情

相关推荐

【ZeloEngine】Lua源码汇总

【ZeloEngine】Lua源码汇总 userdata和light userdata 目前是不用light userdata的 userdata的流程: C++ class Foo注册给lua lua脚本new Foo,lua分配内存,管理gc light userdata则是C++分配内存和构造,一般是对应裸指针,Zelo不用这种用法 检测参数是否是字符串字面量 拼了一个空串,这样编译就会报错了 #define lua_pushliteral(L, s) \ lua_pushlstring(L,

游戏编程扯淡精粹 1064

lua源代码分析01:lua源代码结构分析

“标题1”第三方

魏波 7595

Nmap源码分析(基本框架)

Nmap源码分析(基本框架) 2012年7月18日 Nmap是一款非常强大的开源扫描工具。自己在使用过程中忍不住想仔细阅读一下它的源码。源码里面汇集了众多安全专家的精巧设计与优雅写法,读起来令人心旷神怡而又受益匪浅。 这里我们以阅读nmap6.0的代码作为主线来分析Nmap源码的实现框架。 源码下载地址:http://nmap.org/dist/nmap-6.01.tar.bz2 S

网络安全技术修炼 1万+

lua源码学习:解释器和内嵌库

以前游戏里用到过lua,主要是做配置,所以专门看过《lua程序设计》第二版。后面用lua实现了一个功能,大概几千行代码,当时感觉到写起来方便,调试维护确实不易。听说lua只有2万行代码,便实现了主流动态语言的大部分功能,于是想学习一下。最近开始看了一点lua(5.1.4版本)的源代码,主要是lua解释器和内嵌库(不含debug库和string库的模式匹配)。

https://gitee.com/liuyuan185442111/chest-view 1808

skynet源码分析之sproto解析和构建 ,让你从繁琐中解脱

skynet提供一套与客户端通讯的协议sproto,设计简单,有利于lua使用,参考官方wiki https://github.com/cloudwu/skynet/wiki/Sproto。本篇介绍组装".sproto"文件以及sproto构建流程。之后,会另写一篇介绍sproto的使用方法。 1. 组装.sproto文件流程 以下面简单的test.sproto文件为例介绍.sproto文件组装流程: -- test.sproto .Person { name 0 : string

linuxguitu的博客 3075

skynet源码分析之定时器skynet_timer.c

skynet自带定时器功能skynet-src/skynet_timer.c,在skynet启动时会创建一个线程专门跑定时器。每帧(0.0025秒/帧)调用skynet_updatetime() // skynet-src/skynet_start.c create_thread(&pid[1], thread_timer, m); static void * thread_timer(void *p) { struct monitor * m = p; skynet_ini

420

自娱自乐代码人的源码分析系列汇总

ptmalloc源码分析/Lua源码分析/Nginx源码分析/Memcache源码分析

自娱自乐的代码人 5万+

SQL注入绕过information_schema:实战技法与替代路径详解

SQL注入是Web安全领域的核心漏洞类型,其原理是通过构造恶意SQL语句,干扰应用程序与数据库的正常交互逻辑,从而窃取或篡改数据。在渗透测试与CTF竞赛中,绕过常见防护措施是提升技术能力的关键。当标准的信息收集方式受阻时,例如无法访问information_schema数据库,攻击者需要掌握替代的元数据获取方法。这些技术价值在于模拟真实环境中日益严密的防御体系,锻炼在受限条件下的系统性信息收集思维。典型的应用场景包括存在WAF过滤、权限限制或编码干扰的实战环境。本文将围绕SQL注入这一核心,深入探讨如何利用

weixin_33980459的博客 429

Redis分布式锁进阶源码分析

上面代码还是会有问题,如果扣减代码执行时间大于我们设置的过期时间,redis已经删除了key,其他线程可以获取到锁,并正常执行,但是第一次获取到锁的线程扣减完库存之后,执行了删除key的操作,导致下一个线程丢失锁。b、执行到finally中的对比id已经执行,而删除key没有执行,过期时间到了,此时第二个线程获取到锁,但是第一个线程又执行了删除,极端情况还是会出现误删锁导致超卖。a、增长过期时间其实治标不治本,出问题的概率会变小,但是不代表不会出问题,代码执行时间还是会超过过期时间,导致锁丢失。

projectNo的博客 1087

BEVFusion实战:从零搭建LiDAR-Camera融合的3D目标检测环境(附避坑指南)

本文提供了BEVFusion实战指南,详细讲解如何从零搭建LiDAR-Camera融合的3D目标检测环境。内容涵盖环境配置、数据预处理、模型训练与性能优化等关键步骤,并附有实用的避坑技巧,帮助开发者高效部署这一先进的BEV感知算法。

p4q5r6s7t的博客 514

基于Unity引擎利用OpenCV和MediaPipe的面部表情和人体运动捕捉系统

增加了模型的绑定,利用Mediapipe这个强大的库可以实现识别面部表情的捕捉和人体结构运动的捕捉,基于以上的特性加入到Unity的人物模型中,实现实时的面部表情和人体运行的捕捉

BIgbossyii的博客 1万+

lua判断字符不为空或空格_[Lua虚拟机解析系列]02 Lua字符串类型

Lua字符串*注*:本文根据lichuang/Lua-Source-Internal​github.com修改而成,原文参考Lua版本为5.1.4,本文参考Lua版本为5.3.5本文 Github 地址:yangruihan/Lua-Source-Internal​github.com上一章:[Lua虚拟机解析系列]01 Lua中的数据类型,传送门0. 概述C 语言并没有自带处理字符串类型的库,然...

weixin_32430445的博客 1563

南京银行信息技术岗提前批笔试与面试

1、笔试 笔试大致可以分为三部分:性格测试、行测题目、专业知识 性格测试 性格测试一般会有较多的体量,可能一共大概有一百多道接近两百道的样子,这个是不限时的。 前面有100道是这样的题目,就是有四个选项都是各种形容词,然后分别选出最符合自己的与最不符合自己的选项。这种题你就顺着自己的潜意识填就行了,但是前后要一致,我怀疑他出这么多题,可能就是考一考你记不记得前面填了啥。比如你做到第90题的时候,可能会出现和前面第2题类似的四个形容词,更有甚者就是一模一样的,你要对自己之前选的什么有个比较清楚的记忆。

qq_40971025的博客 6921

【Unity游戏开发】Lua中的os.date和os.time函数

一、简介   最近马三在工作中经常使用到了lua 中的 os.date( ) 和 os.time( )函数,不过使用的时候都是不得其解,一般都是看项目里面怎么用,然后我就模仿写一下。今天正好稍微有点空闲时间就好好地收集了一下相关资料并学习了一下,并将学习结果记录成此博客。 二、os.time和os.date函数说明 1.os.time()函数   os.time()的函数原型与Lua官方的...

weixin_34347651的博客 554

NET 实战:30 天搞定企业级 Web 订餐系统(附完整源码 + 数据库设计)

订餐流程:浏览菜品 → 选择菜品及数量 → 填写送餐地址 → 提交订单 → 数据库记录核心代码(绑定菜品列表):vb' 绑定菜单表到DataGrid控件,展示菜品信息user id=sa;' 查询菜品名称、价格、口味Dim adpt1 As New SqlDataAdapter("select cdishid,vdishname 菜品名称,cdishrate 价格,vdishdescription 口味 from dish", conn)End Sub用户体验优化。

m0_67740236的博客 1517

从零搭建openEuler ARM64开发测试环境:手把手教你用libvirt+KVM配置虚拟机(含VNC远程安装)

本文详细介绍了如何在ARM64平台上从零搭建openEuler开发测试环境,涵盖libvirt和KVM配置虚拟机的完整流程,包括环境准备、存储配置、网络优化、XML配置详解以及VNC远程安装。特别针对华为欧拉(openEuler)系统进行了优化,帮助开发者快速构建高效的ARM架构虚拟化环境。

weixin_30545945的博客 586

Lua - 空值判断的几种情况

【摘要】 在安全领域,lua编程语言因为其小巧在众多工具上都作为插件开发语言,常见的有openresty,nmap等。因此笔者将会开辟一个Lua相关的系列文章,主要记录工作过程中一些领悟或者是一些踩过的坑,希望能够借此平台帮助到读者们。 0x00 背景 最近在写一段nginx+redis的代码,主要基于openresty,其中使用到了lua-resty-redis库。我平时写代码都比较小心,针...

华为云官方博客 9633

MATLAB - ROS 2 工具箱入门教程

ROS 工具箱提供了一个连接 MATLAB® 和 Simulink® 与机器人操作系统(ROS 和 ROS 2)的接口。利用该工具箱,您可以设计 ROS 节点网络,并将 MATLAB 或 Simulink 生成的 ROS 节点与现有的 ROS 网络相结合。工具箱包括 MATLAB 函数和 Simulink 块,可通过记录、导入和回放 rosbag 文件来可视化和分析 ROS 数据。您还可以连接到实时 ROS 网络,访问 ROS 消息。

机器人控制与仿真应用 3068

lua判断字符不为空或空格_Lua - 空值判断的几种情况

【摘要】 在安全领域,lua编程语言因为其小巧在众多工具上都作为插件开发语言,常见的有openresty,nmap等。因此笔者将会开辟一个Lua相关的系列文章,主要记录工作过程中一些领悟或者是一些踩过的坑,希望能够借此平台帮助到读者们。0x00 背景最近在写一段nginx+redis的代码,主要基于openresty,其中使用到了lua-resty-redis库。我平时写代码都比较小心,针对外部输...

weixin_31884015的博客 2366

【全局路径规划模块运动学算法】无人机Kinodynamic A*算法、Kinodynamic RRT*算法(附C++代码)

认知有限,望大家多多包涵,有什么问题也希望能够与大家多交流,共同成长!本文先对Kinodynamic A*算法做个简单的介绍,具体内容后续再更,其他模块可以参考去我其他文章提示:以下是本篇文章正文内容啃这个Kinodynamic A_star算法,建议先啃一啃高飞fast_planner那篇论文,把理论打好,如果还是比较迷,就先看Dijksta、再看A_star、再看hybrid A_star 三个的流程,因为往上资料比较多,再看这个Kinodynamic A_star算法,流程已经很相像了。如果。

qq_35635374的博客 2600

GSDML-V2.3-Schneider-ATV320-20161117.xml

GSDML-V2.3-Schneider-ATV320-20161117.xml

lua 学习记录

2021/01/26 一、lua 字符串原理: 与c#字符串不变性一致

qq_40133830的博客 277

STM32驱动HT1621B显示LCD教程及代码资源

欢迎来到STM32驱动HT1621B显示LCD的学习资源页面。本项目专注于如何使用STM32F10系列微控制器来控制HT1621B液晶驱动器,实现LCD的基本显示功能。适合STM32和HT1621B的初学者,希望通过实践掌握这两个元件之间的交互。背景信息在开发过程中,面对HT1621B和STM32的结合,很多新手可能会遇到理解数据手册、初始化配置和编写驱动程序的挑战。这个资源正是基于解决这些问题而生,旨在为你提供一条清晰的学习路径。主要内容基础理论:简要介绍了STM32F10系列的基本特性和HT1621B的主要工作原理。硬件连接:详细说明了STM32与HT1621B的电路连接方式,包括所需的GPIO配置。驱动程序:提供了核心的C语言代码示例,用于初始化STM32的相关外设,以及编写直接与HT1621B通信的函数。显示函数:包含简单的字符和图形显示函数,从点亮单个像素到显示字符串的实现方法。调试与测试:分享一些常见的问题和调试技巧,帮助你快速定位并解决问题。适用人群初级STM32开发者对LCD显示技术感兴趣的电子爱好者希望了解或扩展HT1621B应用的知识分子

【Redis-6.0.8】Redis源码分析入门

D:\005-01-代码\001-开源项目源码\007-redis\redis-6.0.8.tar\redis-6.0.8\redis-6.0.8\src\server.c中的main函数

Edidaughter的博客 1026

智慧工地数据集项目_包含五万张高分辨率建筑工地现场图像与八万三千个精细标注实例的综合性计算机视觉数据集_专为智慧工地安全生产监控与施工要素自动化识别系统设计_支持深度学习模型训练与.zip

智慧工地数据集项目_包含五万张高分辨率建筑工地现场图像与八万三千个精细标注实例的综合性计算机视觉数据集_专为智慧工地安全生产监控与施工要素自动化识别系统设计_支持深度学习模型训练与.zip

minigui1.6.10.rar_嵌入式Linux_Unix_Linux_

整理了关于如何将minigui1.6.10移植到PC机和arm开发板上的步骤,

RuoYi-Vue-Plus 与 RuoYi-Cloud-Plus 高端进阶 源码分析 系列教程

高端进阶 源码分析 系列教程

李虹柏的博客 6万+
上一篇: 转载和积累系列 - 分析服务器日志常用命令
下一篇: Lua源码分析 - 基础篇 - 全局状态机的实现(02)
老码农zhuli
老码农zhuli 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄14年 2456粉丝 312原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值