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解释器是一种优化技术,旨在适应特定环境和需求,通过减小尺寸、提升效率、增强安全性和提升用户体验来满足不同应用场景的要求。
时间流逝、年龄增长,是自己的磨炼、对知识技术的应用,还有那不变的一颗对嵌入式热爱的心!
点赞o( ̄▽ ̄)d、关注(o)/~、评论(▽)!
相关文章:

Lua解释器裁剪
本文目录 1、引言2、文件功能3、选择需要初始化的库4、结论 文章对应视频教程: 已更新。见下方 点击图片或链接访问我的B站主页~~~ Lua解释器裁剪,很简单~ 1、引言 在嵌入式中使用lua解释器,很多时候会面临资源紧张的情况。 同时,…...
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通信中的行为和使用的通信机制。下面是对这两个环境变量的详细解读࿱…...

使用 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被用来告知系统在该时间戳之前的数据已经全部到达ÿ…...
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、猜数字 描述:创建一个简单的猜数字游戏,程序会随机生成一个数字,玩家需要猜出这个数字是…...

Linux应用开发之网络套接字编程(实例篇)
服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
智能职业发展系统:AI驱动的职业规划平台技术解析
智能职业发展系统:AI驱动的职业规划平台技术解析 引言:数字时代的职业革命 在当今瞬息万变的就业市场中,传统的职业规划方法已无法满足个人和企业的需求。据统计,全球每年有超过2亿人面临职业转型困境,而企业也因此遭…...

【大模型】RankRAG:基于大模型的上下文排序与检索增强生成的统一框架
文章目录 A 论文出处B 背景B.1 背景介绍B.2 问题提出B.3 创新点 C 模型结构C.1 指令微调阶段C.2 排名与生成的总和指令微调阶段C.3 RankRAG推理:检索-重排-生成 D 实验设计E 个人总结 A 论文出处 论文题目:RankRAG:Unifying Context Ranking…...
P10909 [蓝桥杯 2024 国 B] 立定跳远
# P10909 [蓝桥杯 2024 国 B] 立定跳远 ## 题目描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 $n$ 个检查点 $a_1, a_2, \cdots , a_n$ 且 $a_i \ge a_{i−1} > 0$。小明必须先后跳跃到每个检查点上且只能跳跃到检查点上。同时࿰…...