当前位置: 首页 > news >正文

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

相关文章:

Lua解释器裁剪

本文目录 1、引言2、文件功能3、选择需要初始化的库4、结论 文章对应视频教程: 已更新。见下方 点击图片或链接访问我的B站主页~~~ Lua解释器裁剪,很简单~ 1、引言 在嵌入式中使用lua解释器,很多时候会面临资源紧张的情况。 同时&#xff0c…...

web前端设计nav:深入探索导航栏设计的艺术与技术

web前端设计nav:深入探索导航栏设计的艺术与技术 在web前端设计中,导航栏(nav)扮演着至关重要的角色,它不仅是用户浏览网站的指引,更是网站整体设计的点睛之笔。本文将从四个方面、五个方面、六个方面和七…...

分析解读NCCL_SHM_Disable与NCCL_P2P_Disable

在NVIDIA的NCCL(NVIDIA Collective Communications Library)库中,NCCL_SHM_Disable 和 NCCL_P2P_Disable 是两个重要的环境变量,它们控制着NCCL在多GPU通信中的行为和使用的通信机制。下面是对这两个环境变量的详细解读&#xff1…...

使用 Python 进行测试(6)Fake it...

总结 如果我有: # my_life_work.py def transform(param):return param * 2def check(param):return "bad" not in paramdef calculate(param):return len(param)def main(param, option):if option:param transform(param)if not check(param):raise ValueError(…...

Flink Watermark详解

Flink Watermark详解 一、概述 Flink Watermark是Apache Flink框架中为了处理乱序和延迟事件时间数据而引入的一种机制。在流处理中,由于数据可能不是按照事件产生的时间顺序到达的,Watermark被用来告知系统在该时间戳之前的数据已经全部到达&#xff…...

LeetCode538.把二叉搜索树转换为累加树

class Solution { public:int sum 0; TreeNode* convertBST(TreeNode* root) { if (root){convertBST(root->right);sum root->val;root->val sum;convertBST(root->left);}return root;}};...

关于编程思想

面向过程思想 面向过程就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现,使用的时候再一个一个的依次调用就可以了 JS就是典型的面向过程的编程语言 优点: 性能比面向对象编程高,适合跟硬件联系很紧密的东西…...

521. 最长特殊序列 Ⅰ(Rust单百解法-脑筋急转弯)

题目 给你两个字符串 a 和 b,请返回 这两个字符串中 最长的特殊序列 的长度。如果不存在,则返回 -1 。 「最长特殊序列」 定义如下:该序列为 某字符串独有的最长 子序列 (即不能是其他字符串的子序列) 。 字符串 s …...

【YashanDB知识库】PHP使用OCI接口使用数据库绑定参数功能异常

【问题分类】驱动使用 【关键字】OCI、驱动使用、PHP 【问题描述】 PHP使用OCI8连接yashan数据库,使用绑定参数获取数据时,出现报错 如果使用PDO_OCI接口连接数据库,未弹出异常,但是无法正确获取数据 【问题原因分析】 开启O…...

深入分析 Android BroadcastReceiver (三)

文章目录 深入分析 Android BroadcastReceiver (三)1. 广播消息的优缺点及使用场景1.1 优点1.2 缺点 2. 广播的使用场景及代码示例2.1. 系统广播示例:监听网络状态变化 2.2. 自定义广播示例:发送自定义广播 2.3. 有序广播示例:有序广播 2.4. …...

在java中使用Reactor 项目中的一个类Mono,用于表示异步单值操作

Mono 是 Reactor 项目中的一个类,用于表示异步单值操作。Reactor 是一个响应式编程库,广泛应用于 Java 中的异步编程和非阻塞 I/O 操作。Mono 可以类比为一个可能(或将来)包含零个或一个值的异步计算结果。与 Flux(另一…...

LabVIEW故障预测

在LabVIEW故障预测中,振动信号特征提取的关键技术主要包括以下几个方面: 时域特征提取:时域特征是直接从振动信号的时间序列中提取的特征。常见的时域特征包括振动信号的均值、方差、峰值、峰-峰值、均方根、脉冲指数等。这些特征能够反映振动…...

掌握JavaScript中的`async`和`await`:循环中的使用指南

引言 在JavaScript的异步编程中,async和await提供了一种更接近同步代码的写法,使得异步逻辑更加清晰易懂。然而,当它们与循环结合时,一些常见的陷阱和误区可能会出现。本文将通过代码示例,指导你如何在循环中正确使用…...

java第二十三课 —— 继承

面向对象的三大特征 继承 继承可以解决代码复用,让我们的编程更加靠近人类思维,当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子…...

不可不知的Java SE技巧:如何使用for each循环遍历数组

哈喽,各位小伙伴们,你们好呀,我是喵手。运营社区:C站/掘金/腾讯云;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点,并以文字的形式跟大家一起交流,互相学习,一…...

机器人建模、运动学与动力学仿真分析(importrobot,loadrobot,smimport)

机器人建模、运动学与动力学仿真分析是机器人设计和开发过程中的关键步骤。 一、机器人建模 机器人建模是描述机器人物理结构和运动特性的过程。其中,URDF(Unified Robot Description Format)是一种常用的机器人模型描述方法。通过URDF&…...

02-QWebEngineView的使用

Qt WebEngine_hitzsf的博客-CSDN博客 一、QWebEngineView QWebEngineView 类是一个实现Web浏览器的便捷类,提供了back() 、forward()、reload()、stop() 等方法,可轻松实现页面的前进、后退、重载等导航功能,要实现一个简单的只有网页加载网…...

【2024亲测无坑】在Centos.7虚拟机上安装Oracle 19C

目录 一、安装环境准备 1、linux虚拟机安装 2、虚拟机快照 3、空间检查&软件上传 二、Oracle软件安装 1.preinstall安装及其他配置准备 2.oracle安装 三、数据库实例的安装 1.netca——网络配置助手 2.dbca——数据库配置助手 四、ORACLE 19C 在linux centos 7上…...

JS中判断一个字符串中出现次数最多的字符,统计这个次数?

在JavaScript中,要判断一个字符串中出现次数最多的字符并统计这个次数,你可以通过创建一个对象来记录每个字符出现的次数,然后遍历这个对象以找到出现次数最多的字符。下面是一个简单的示例代码: function findMostFrequentChar(…...

rust-强化练习

钓鱼不打窝,钓的也不多 语言只靠看不行,还得练,下面是AI生成的一些题目,后续直接肝LeeCode,一举2得 1、猜数字 描述:创建一个简单的猜数字游戏,程序会随机生成一个数字,玩家需要猜出这个数字是…...

TF-IDF算法

TF-IDF算法详解 一、TF-IDF算法概述 TF-IDF(Term Frequency-Inverse Document Frequency)算法是一种常用于信息检索和文本挖掘的加权技术。其基本思想是通过评估一个词在文档中的重要性,来确定这个词在文档集合或语料库中的权重。TF-IDF算法…...

R语言数据分析案例29-基于ARIMA模型的武汉市房价趋势与预测研究

一、选题背景 房地产行业对于国民经济和社会及居民的发展和生活具有很大的影响,而房价能够体现经济运转的好坏,因而房价的波动牵动着开发商和购房者的关注,城市房价预测是一个研究的热点问题,研究房价对民生问题具有重要意义。 …...

面试-NLP八股文

机器学习 交叉熵损失: L − ( y l o g ( y ^ ) ( 1 − y ) l o g ( 1 − ( y ^ ) ) L-(ylog(\hat{y}) (1-y)log(1-(\hat{y})) L−(ylog(y^​)(1−y)log(1−(y^​))均方误差: L 1 n ∑ i 1 n ( y i − y ^ i ) 2 L \frac{1}{n}\sum\limits_{i1}^{n}…...

数据仓库之离线数仓

离线数据仓库(Offline Data Warehouse)是一种以批处理方式为主的数据仓库系统,旨在收集、存储和分析大量历史数据。离线数据仓库通常用于定期(如每日、每周、每月)更新数据,以支持各种业务分析、报表生成和…...

Mybatis源码解析

MybatisAutoConfiguration或者MybatisPlusAutoConfiguration核心作用是初始化工厂类SqlSessionFactory,其中包含属性interceptors、MapperLocations、TypeAliasesPackage、TypeEnumsPackage、TypeHandlers等。 MybatisAutoConfiguration自动装配类是由依赖&#xf…...

前端学习CSS之神奇的块浮动

在盒子模型的基础上就可以对网页进行设计 不知道盒子模型的可以看前面关于盒子模型的内容 而普通的网页设计具有一定的原始规律,这个原始规律就是文档流 文档流 标签在网页二维平面内默认的一种排序方式,块级标签不管怎么设置都会占一行,而同一行不能放置两个块级标签 行级…...

【Java】内部类、枚举、泛型

目录 1.内部类1.1概述1.2分类1.3匿名内部类(重点) 2.枚举2.1一般枚举2.2抽象枚举2.3应用1:用枚举写单例2.4应用2:标识常量 3.泛型3.1泛型认识3.2泛型原理3.3泛型的定义泛型类泛型接口泛型方法 3.4泛型的注意事项 1.内部类 1.1概述 内部类:指…...

LabVIEW电子类实验虚拟仿真系统

开发了基于LabVIEW开发的电子类实验虚拟仿真实验系统。该系统通过图形化编程方式,实现了复杂电子实验操作的虚拟化,不仅提高了学生的操作熟练度和学习兴趣,而且通过智能评价模块提供即时反馈,促进教学和学习的互动。 项目背景 在…...

SVM支持向量机

SVM的由来和概念 间隔最大化是找最近的那个点的距离’ 之前我们学习的都是线性超平面,现在我们要将超平面变成圈 对于非线性问题升维来解决 对于下图很难处理,我们可以将棍子立起来,然后说不定red跑到左边了,green跑到右边了(可能增加了某种筛选条件导致两个豆子分离)(只是一种…...

【Unity】RPG2D龙城纷争(二)关卡、地块

更新日期:2024年6月12日。 项目源码:后续章节发布 索引 简介地块(Block)一、定义地块类二、地块类型三、地块渲染四、地块索引 关卡(Level)一、定义关卡类二、关卡基础属性三、地块集合四、关卡初始化五、关…...

国内专门做酒的网站/百度app下载

题目:Remove Nth Node From End of List 删除链表从尾部到头部第N的节点。 思路: 两个指针,一个从头开始前移N个节点后,第二个指针开始移动,当第一指针移动到末尾时,第二个指针指向的是从尾部到头部的第N个…...

网站设计赚钱吗/软文推广是什么

《一个Android工程的从零开始》-1前期准备 先扯两句 很早就在CSDN上看各路大神发的博客,可以说我今天没饿死,很大程度上,也正是得益于各路大神的无私分享。 一想到从今天起,自己也能发些东西出来,或许可以帮到哪些人…...

南京当的网站/中国制造网网站类型

计划2015年每天写一篇文章 由于文章编辑器的效率实在太低,所以选择演示文稿导出成图片 部分内容直接使用我在曾经北京航空航天大学开设的《移动终端用户交互工程》的演示文稿,同样效率原因因而直接贴图片 提问请移步 http:/…...

p2p网站建设的步骤过程/下拉关键词排名

零拷贝 零拷贝不是真的0次拷贝,而是减少拷贝次数,所有的零拷贝分为两个层面: (1)OS级别 传统IO: 硬盘->内核缓冲区->用户缓冲区->内核缓冲区->socket缓冲区-》socket缓冲区-》网卡&#xf…...

电子商务网站建设与管理考试/关键词挖掘工具

九、map 9.1 map概述 map是key-value数据结构,又称为字段或者关联数组。类似其它编程语言的集合,在编程中是经常使用到 基本语法 var map 变量名 map[keytype]valuetypekey可以是什么类型 golang中的map,的 key 可以是很多种类型&#xf…...

免费网站建设塔山双喜/风云榜

第一步:Mac OS自带Apache,只需要启动Apache就行。 打开终端,输入命令:sudo apachectl start 第二步:打开浏览器,在地址栏中输入localhost,出现It Works字符串,就说明Apache已经成功启…...