Lua解释器裁剪

本文目录

  • 1、引言
  • 2、文件功能
  • 3、选择需要初始化的库
  • 4、结论


文章对应视频教程:

已更新。见下方


点击图片或链接访问我的B站主页~~~

Lua解释器裁剪,很简单~


1、引言

在嵌入式中使用lua解释器,很多时候会面临资源紧张的情况。
同时,哪怕资源不紧张,我们也会考虑对lua解释器进行裁剪,本文就在上篇帖子的基础上进行裁剪演示。
《Lua移植到标准ANSI C环境》


2、文件功能

在lua解释器裁剪前,我们需要知道lua具备哪些功能,哪些功能可以裁剪。
对应的功能放在什么文件夹中。
我根据我自己的经验对lua 5.4.6版本的源码进行了简单的总结,每个文件的功能如下图:

在这里插入图片描述
这个图上记录了5.4.6版本中所有Lua解释器源码对应的作用,其中棕色的标记的文件就是我们此次要进行裁剪的功能对应的文件。


3、选择需要初始化的库

首先,打开工程路径lua\source\lua,找到路径下的linit.c文件:
文件中对应的初始化时加载的库代码(我已经添加了注释):

/*
** these libs are loaded by lua.c and are readily available to any Lua
** program
*/
static const luaL_Reg loadedlibs[] = {
  {LUA_GNAME, luaopen_base},                  /*全局变量和函数,如_G全局表。 */
  {LUA_LOADLIBNAME, luaopen_package},         /*加载机制,提供动态加载库的功能。 */
  {LUA_COLIBNAME, luaopen_coroutine},         /*协程库,支持创建和管理协程。 */
  {LUA_TABLIBNAME, luaopen_table},            /*表操作库,提供表相关的操作函数。 */
  {LUA_IOLIBNAME, luaopen_io},                /*I/O操作库,提供文件和标准输入输出的操作函数。 */
  {LUA_OSLIBNAME, luaopen_os},                /*操作系统服务库,提供操作系统相关的函数,如环境变量、进程管理等。 */
  {LUA_STRLIBNAME, luaopen_string},           /*字符串操作库,提供字符串处理函数。*/ 
  {LUA_MATHLIBNAME, luaopen_math},            /*数学库,提供数学相关函数,如三角函数、随机数等。 */
  {LUA_UTF8LIBNAME, luaopen_utf8},            /*UTF-8编码库,提供UTF-8编码相关的操作函数。 */
  {LUA_DBLIBNAME, luaopen_debug},             /*调试库,提供调试相关功能,如打印堆栈信息、设置断点等。*/
  {NULL, NULL}
};

这段代码决定了lua初始化时,可以加载的库类型。
我们选择注释掉第二小节中不需要的库。

/*
** these libs are loaded by lua.c and are readily available to any Lua
** program
*/
static const luaL_Reg loadedlibs[] = {
  {LUA_GNAME, luaopen_base},                  /*全局变量和函数,如_G全局表。 */
  // {LUA_LOADLIBNAME, luaopen_package},         /*加载机制,提供动态加载库的功能。 */
  // {LUA_COLIBNAME, luaopen_coroutine},         /*协程库,支持创建和管理协程。 */
  {LUA_TABLIBNAME, luaopen_table},            /*表操作库,提供表相关的操作函数。 */
  // {LUA_IOLIBNAME, luaopen_io},                /*I/O操作库,提供文件和标准输入输出的操作函数。 */
  // {LUA_OSLIBNAME, luaopen_os},                /*操作系统服务库,提供操作系统相关的函数,如环境变量、进程管理等。 */
  {LUA_STRLIBNAME, luaopen_string},           /*字符串操作库,提供字符串处理函数。*/ 
  {LUA_MATHLIBNAME, luaopen_math},            /*数学库,提供数学相关函数,如三角函数、随机数等。 */
  {LUA_UTF8LIBNAME, luaopen_utf8},            /*UTF-8编码库,提供UTF-8编码相关的操作函数。 */
  // {LUA_DBLIBNAME, luaopen_debug},             /*调试库,提供调试相关功能,如打印堆栈信息、设置断点等。*/
  {NULL, NULL}
};

同时可以把图中对应橙色部分的文件删除掉:
在这里插入图片描述

重新编译工程:
在这里插入图片描述
在这里插入图片描述
编译通过。
执行编译完成的程序:
在这里插入图片描述

所有的测试仍然可以通过,说明我们的裁剪没有对我们需要的功能造成影响。
因为在测试代码中,我们已经将相关的功能的测试代码已经注释掉了。
在这里插入图片描述
如果没有注释掉的话,测试代码就会产生断言,导致测试无法完全通过。


4、结论

关于lua解释器的裁剪就完成了,对其裁剪有利于嵌入式的应用,满足更多的使用场景。
好处有以下几点:

减小体积:裁剪可以移除不常用或不需要的功能模块,显著减少Lua解释器的二进制大小。这对于资源受限的环境尤为重要,比如嵌入式设备、游戏引擎、路由器固件(如OpenWRT)等,它们往往对存储空间有严格要求。

提高效率:去除不必要的功能可以减少解析和执行时的内存占用,提升运行效率。对于性能敏感的应用,如实时系统,这一点尤为关键。

增强安全性:通过裁剪,可以移除潜在的安全风险点,比如网络或文件系统访问相关的API,从而为系统增加一层保护,防止恶意脚本攻击。

简化接口:裁剪过程可以定制Lua环境,仅保留与应用场景直接相关的API,这样可以简化开发者的使用界面,降低学习成本和出错概率。

定制化功能:根据特定应用场景的需求,裁剪解释器可以集成特定的C库或功能,实现高度定制化的解决方案,提高软件的适应性和灵活性。

加快启动速度:更小的代码量意味着更快的加载时间,这对于需要快速启动的场景(如游戏加载、即时响应系统)特别有益。

综上所述,裁剪Lua解释器是一种优化技术,旨在适应特定环境和需求,通过减小尺寸、提升效率、增强安全性和提升用户体验来满足不同应用场景的要求。


时间流逝、年龄增长,是自己的磨炼、对知识技术的应用,还有那不变的一颗对嵌入式热爱的心!

到这里就结束了!希望大家给我的文章和B站视频
点赞o( ̄▽ ̄)d、关注(o)/~、评论(▽)!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/704527.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

海豚调度清理:使用 API 轻松清理历史工作流实例以及日志文件

💡 本系列文章是 DolphinScheduler 由浅入深的教程,涵盖搭建、二开迭代、核心原理解读、运维和管理等一系列内容。适用于想对 DolphinScheduler了解或想要加深理解的读者。 祝开卷有益。 大数据学习指南 大家好,我是小陶,DolphinS…

AI落地好项目,一张照片秒生成个人写真

AI变现好项目,秒生成个人写真 只需要输入1张照片,无需训练,就能秒级生成个人写真? 你没听错,就是这个神奇的AI工具–InstantID。 众所周知,AI图生图面临的挑战之一是无法保持较高的角色一致性&#xff0c…

敏捷项目管理工具排行榜:打造高效敏捷开发环境的利器

最常见的敏捷项目管理工具包括:Leangoo领歌、Trello、Asana、ClickUp等 在敏捷开发的世界里,项目管理工具如同指挥棒,引领着团队快速响应变化,持续交付价值。介绍几款业内领先的敏捷项目管理工具,帮组大家选择最适合自…

男士内裤买便宜还是贵的?2024年高性价比男士内裤汇总分享

男生内裤,作为贴身衣物,承载着男性的私密与舒适。然而,许多男士的内裤状况却让人大跌眼镜:穿到变形、腰部松垮无弹性,屁股后面甚至出现破洞,这样的景象已然屡见不鲜。更有些男士的内裤,中间一个…

【Pandas】可视化plot()参数kind

Pandas是一个强大的数据分析库,它内置了基于matplotlib的数据可视化功能,使得直接在DataFrame和Series上进行绘图变得非常方便。在pandas中,.plot()方法允许用户通过kind参数灵活地选择多种图表类型。 导库 import numpy as np import pand…

「51媒体」江苏有哪些媒体-参会-宣发-专访-直播

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 在江苏省,媒体资源丰富,涵盖了参会、宣发、专访和直播等多个方面。以下是对这些媒体资源的详细归纳: 一、参会媒体 本地主流媒体:如无锡日…

HTTP3版本和实现验证

HTTP3协议基于Google的 QUIC 协议,由互联网工程任务组(IETF)来制定。目录还是草案,已经进行到第33版。 HTTP3 是基于 QUIC 协议的 http。传输层是UDPQUIC,应用层仍是HTTP,即request/respose, request里也仍…

学会情感化设计,让用户舍不得离开!

万物皆有个性,万物都会发出情感信号。即使这不是设计者的初衷,用户在浏览网站时也会推断出网站的个性,体验到网站的情感。 — 用户体验设计大师 Don Norman 正如设计大师唐诺曼所说,情感是我们生活重要的组成部分,情感…

Postgresql源码(135)生成执行计划——Var的调整set_plan_references

1 总结 set_plan_references主要有两个功能: 拉平:生成拉平后的RTE列表(add_rtes_to_flat_rtable)。调整:调整前每一层计划中varno的引用都是相对于本层RTE的偏移量。放在一个整体计划后,需要指向一个统一…

【区块链】记账的千年演化:从泥板到区块链

🌈个人主页: 鑫宝Code 🔥热门专栏: 闲话杂谈| 炫酷HTML | JavaScript基础 ​💫个人格言: "如无必要,勿增实体" 文章目录 记账的千年演化:从泥板到区块链引言一、古代记账:泥板与…

深度学习(三)——Transforms的使用

一、Transforms的结构及用法 导入transforms from torchvision import transforms作用:图片输入transforms后,可以得到一些预期的变换 1. Transforms的python用法 写在前面:tensor数据类型 通过transforms.ToTensor去说明两个问题&#…

如何更新 iOS 18 Beta 版本?具体步骤总结

如何更新 iOS 18 Beta 想必有一些用户已经迫不及待的想要知道怎么更新 iOS 18 Beta 版本了吧,下面就给大家总结了具体的操作步骤: 在更新 iOS 18 Beta 版本之前记得我们需要将手机的数据进行备份,大家可以自行选用备份软件比如 iCloud 等。…

vb.net小demo(计算器、文件处理等/C#也可看)

Demo1:使用窗体控件实现一个简易版计算器 Public Class Form1Private Sub Button_1_Click(sender As Object, e As EventArgs) Handles Button_1.ClickCalSubBox.Text Button_1.TextEnd SubPrivate Sub Button_2_Click(sender As Object, e As EventArgs) Handles …

使用RV1126交叉编译工具链交叉编译opencv,c++代码直接调用VideoCapture 读取摄像头数据

使用RV1126交叉编译工具链交叉编译opencv,rv1126直接调用VideoCapture 读取摄像头数据 前言环境一、ubantu安装二、交叉编译工具安装三、cmake升级四、ffmpeg安装五、opencv安装六、c代码测试(上板运行) 前言 交叉编译是一种将软件在操作系统…

超详解——​深入理解Python中的位运算与常用内置函数/模块——基础篇

目录 ​编辑 1.位运算 2.常用内置函数/模块 math模块 random模块 decimal模块 常用内置函数 3.深入理解和应用 位运算的实际应用 1.权限管理 2.位图 3.图像处理 2.math模块的高级应用 统计计算 几何计算 总结 1.位运算 位运算是对整数在内存中的二进制表示进行…

Android Uri转File path路径,Kotlin

Android Uri转File path路径,Kotlin /*** URI转化为file path路径*/private fun getFilePathFromURI(context: Context, contentURI: Uri): String? {val result: String?var cursor: Cursor? nulltry {cursor context.contentResolver.query(contentURI, null…

设计模式-创建型-04-建造者模式

1、盖房项目需求 1)需要建房子:这一过程为打桩、砌墙、封顶2)房子有各种各样的,比如普通房,高楼,别墅,各种房子的过程虽然一样,但是要求不要相同的3)请编写程序&#xf…

模拟信号转RS-485/232,数据采集A/D转换模块 YL21

特点: ● 模拟信号采集,隔离转换 RS-485/232输出 ● 采用12位AD转换器,测量精度优于0.1% ● 通过RS-485/232接口可以程控校准模块精度 ● 信号输入 / 输出之间隔离耐压3000VDC ● 宽电源供电范围:8 ~ 32VDC ● 可靠性高&…

【Axure高保真原型】拖拉拽动态编辑可视化页面

今天和大家分享拖拉拽动态编辑可视化页面的原型模板,我们可以拖动左侧工具列表的图表,添加到页面,可以多次添加,添加后可以拖动图表的位置,或者鼠标移入图表后点击delete键删除多余的图表,案例中提供10中常…

我国间二甲苯零售规模逐渐扩大 进口量有所下滑

我国间二甲苯零售规模逐渐扩大 进口量有所下滑 间二甲苯(MX)又称为1,3-二甲苯,是苯的两个氢基被两个甲基取代后形成的一种有机化合物。间二甲苯的化学方程式为C8H10,多表现为一种无色透明的液体,不溶于水,但…