Lua解释器裁剪

news2024/11/17 3:48:44

本文目录

  • 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)/~、评论(▽)!

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

木头姐预测:2029年特斯拉股价将达2600美元,市值8.2万亿美元

ARK预计特斯拉将在未来两年内推出robotaxi服务,并估计到2029年特斯拉近90%的市值和盈利将归功于robotaxi业务。此外研究表明,FSD模式下的特斯拉比人类驾驶的特斯拉安全约5倍,比道路上的普通汽车安全约16倍。 北京时间12日晚,木头姐…

如何识别和管理软件测试风险?

TestComplete 是一款自动化UI测试工具,这款工具目前在全球范围内被广泛应用于进行桌面、移动和Web应用的自动化测试。 TestComplete 集成了一种精心设计的自动化引擎,可以自动记录和回放用户的操作,方便用户进行UI(用户界面&…

通用大模型和垂直大模型,如何选择?

通用大模型和垂直大模型在多个方面存在显著的区别。就像生活中的全才能手和行业里的高精专家,各有千秋,各有魅力。从专业角度分析,他们有以下这些区别: 1.定义与特点: 通用大模型: 是一…

跨界合作机会:通过淘宝数据挖掘潜在的合作伙伴与市场拓展方向

淘宝平台汇聚了众多商家和消费者,生成了大量的交易数据,这些数据为商家提供了挖掘跨界合作机会和市场拓展方向的丰富线索。以下是如何利用淘宝数据来寻找潜在的合作伙伴和探索新的市场机会的一些策略: 消费者行为分析:通过跟踪消费…

1.Element的table表高度自适应vue3+js写法

解决方法 在页面table上添加id,动态计算每页table的最大高度 ,将高度保存在store中,每次切换路由时进行计算。 文章目录 解决方法前言一、页面table使用二、store状态库1.引入库 效果 前言 提示:状态管理使用的是pinia,用法参考…

湿气难除?可能是方法用错了!看完这篇,精准祛湿!

立夏过后,你是不是也经常有这样的感觉: 早上睡不醒,越睡越累 脑袋变得沉沉甸甸 手脚像灌了铅,抬不起胳膊,迈不开步子 面对一桌美味也没有胃口 脸上还容易冒油、长痘,浑身有湿漉漉、黏糊糊的感觉&a…

Pikachu上的CSRF以及NSSCTF上的[NISACTF 2022]bingdundun~、 [SWPUCTF 2022 新生赛]xff

目录 一、CSRF CSRF(get) login CSRF(post) CSRF Token 二、CSRF的相关知识点 (1)什么是CSRF? (2)工作原理 (3)CSRF漏洞形成的条件 1、用户要在登录状态(即浏览器保存了该…

【python】else与循环的搭配使用

看代码时发现的一种写法,学习一下。 1.for1)break2)no break 2.while1)break2)no break 几乎所有语言中,else的常用搭配就是if,而在python中else还可以和循环搭配使用,让代码更加pyt…

胡海建以“限时速运”填补市场空白,让跨越速运顺利突围

作为现代经济体系的重要支柱,物流行业近年来呈现出蓬勃发展的态势。各大物流企业也在竞争中不断向前。其中,跨越速运以“当天达”“次日达”“隔日达”三大跨省时效产品被广为认可。这背后,是跨越速运董事长胡海建对“限时速运”的精准把握。…

开源项目-Docker部署学之思管理系统

开源-Docker部署学之思管理系统 文章目录 开源-Docker部署学之思管理系统资源列表基础环境一、安装Docker二、配置加速器三、查看Docker版本四、Git获取源码五、编辑SQL脚本六、访问管理系统如果访问或者登录的时候出现内部服务错误,评论或私信,我给你解…

vue-pdf-embed 跨域(配置nginx允许跨域)

业务中有个功能需要实现预览pdf,使用了vue-pdf-embed。预览跨域报错。 原nginx路径配置 nginx需要增加跨域处理 增加这一行代码add_header Access-Control-Allow-Origin *; location /files/ {add_header Access-Control-Allow-Origin *;alias C:/uploadFile/; }

B端系统导航有哪些类型?本文告诉你7个常用的。

B端系统相对与C端来说,功能复杂,信息量大,流程负复杂,层级深,这个时候到就显得尤为重要了,直接关乎用户体验,本文大美B端工场带领大家看看这个问题。 一、导航对于B端系统的重要性 导航在B端系…

unity 打包PC安装包中常见文件的功能

目录 前言 一、打包好的文件 二、常用文件 1.文件夹XXX_Data 2.文件夹MonoBleedingEdge 3.文件夹XXX_Data内部 三、文件的应用 1.如果你替换了一个图片 2.如果你新增了或减少了图片和资源 3.场景中有变动 4.resources代码加载的资源改了 5.如果你代码替换了 四、作…

【笔记】【Git】多个dev分支合并到master分支的文件冲突

问题描述 多个dev分支在同步开发,同时发起代码评审,但合入master的时候存在先后顺序,那么后面同文件的操作则会提示“合并有文件冲突”,导致代码无法入库,只能重新提交。 在个人分支中如何解决与master分支差异,从何顺利提交评审合入代码? 参考方案 1、按照下面的流程…

智慧煤矿中的视觉分析:高效的下料口堵塞检测方案

随着工业4.0的推进,智慧煤矿逐渐成为煤炭行业的重要发展方向。智慧煤矿通过引入物联网、大数据、人工智能等技术,实现了矿井作业的自动化和智能化,从而提高了生产效率和安全水平。在智慧煤矿的运营过程中,下料口堵塞是一个常见且严…

【2024最新华为OD-C/D卷试题汇总】[支持在线评测] 团队派遣(100分) - 三语言AC题解(Python/Java/Cpp)

🍭 大家好这里是清隆学长 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-C/D卷的三语言AC题解 💻 ACM银牌🥈| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍓OJ题目截图 📎在线评测链接 团队派遣(100分) 🌍 评测功能需要订阅专栏…

硬核:浏览器发展的四大方向,早把C/S挤到犄角旮旯了。

浏览器是互联网的基础设施,浏览器早不满足于作为上网入口,而是全面进化啦,比如各类应用开始web化,同时浏览器也被分装到桌面应用中去,本文就给大家分享一下浏览器发展的四大方向。 方向一: 传统桌面浏览器…

一文读懂Web Codecs API:浏览器背后的媒体魔术师

引言 ​在早期的Web 网页中,视频播放通常要依靠 Flash 和 Silverlight 等插件来完成,浏览器是不支持直接播放视频的。 随着网络技术的发展,视频这种媒体方式的需求变得普遍,HTML5中,出现了一个新的元素Video&#xf…

VMware Workstation 16安装Redhat6.9

一、创建虚拟机及安装操作系统 1、创建虚拟机 VMware Workstation 16 创建虚拟机 2、安装Redhat6.9 1.挂载系统镜像 2.开启虚拟机,安装操作系统 3.选择【Install or upgrade an existing system】 4.默认,跳过 5.默认,【Next】 5.选择中文…

错误记录:调用原生TvSettings 的 com.android.tv.settings.device.storage.ResetActivity 无法启动

错误现场 起因:第三方 app 调用原生TvSettings 的 com.android.tv.settings.device.storage.ResetActivity ,发现无法启动,查看Log有报错。原因:未设置 android:exported“true”错误:ActivityTaskManager: Permissio…