【Bp2Lua】常量折叠和变量折叠

news2025/1/13 17:38:57

【Bp2Lua】常量折叠和变量折叠

谈一下编译器折叠优化算法

动机

变量折叠是 bp2lua 早期确定的两个技术卡点之一

bp2lua 做尽可能保守和必要的优化,提升生成代码的可读性,方便在生成代码上进行二次开发

常量折叠

常量折叠 - 维基百科,自由的百科全书

基本上大部分编译器,包括 Lua,都会进行编译时的常量折叠,算法核心是在 AST 上算常量表达式的可达性

变量折叠

变量折叠是我在开发 bp2lua 时临时想的一个算法,灵感基础是常量折叠+Pycharm的 inline refactor

a 上进行 inline refactor,点击 OK
在这里插入图片描述

a 被干掉

在这里插入图片描述

现在 a 被引用 2 次,注意 foo 调用有副作用,修改了状态

在这里插入图片描述

这时干掉 a ,就是错的

在这里插入图片描述

案例分析:S_LootItem_RPC

蓝图

在这里插入图片描述

-- before var fold
function M:S_LootItem_RPC(ItemRowName, MyInventory)
	K2Node_CustomEvent_ItemRowName = ItemRowName
	K2Node_CustomEvent_MyInventory = MyInventory
	_getInventoryQuantity_Quantity = self.AC_Inventory:getInventoryQuantity(K2Node_CustomEvent_ItemRowName)
	_Greater_IntInt_ReturnValue = (_getInventoryQuantity_Quantity > 0)
	if _Greater_IntInt_ReturnValue then
		self.AC_Inventory:RemoveInventory(K2Node_CustomEvent_ItemRowName, _getInventoryQuantity_Quantity)
		K2Node_CustomEvent_MyInventory:AddInventory(K2Node_CustomEvent_ItemRowName, _getInventoryQuantity_Quantity)
	end
end

-- after var fold
function M:S_LootItem_RPC(ItemRowName, MyInventory)
	local K2Node_CustomEvent_ItemRowName
	local _getInventoryQuantity_Quantity
	K2Node_CustomEvent_ItemRowName = ItemRowName
	_getInventoryQuantity_Quantity = self.AC_Inventory:getInventoryQuantity(K2Node_CustomEvent_ItemRowName)
	if _getInventoryQuantity_Quantity > 0 then
		self.AC_Inventory:RemoveInventory(K2Node_CustomEvent_ItemRowName, _getInventoryQuantity_Quantity)
		MyInventory:AddInventory(K2Node_CustomEvent_ItemRowName, _getInventoryQuantity_Quantity)
	end
end

后续问题

前面讨论的不能折叠的原因,看起来如果函数是 const 的,就可以了,可惜脚本并没有 const 机制,蓝图搞了个 pure,也只是 meta 标记罢了,没法保证计算结果真的正确

举个例子,比如下面这个 条件表达式 是 pure 的,可以干掉整个 if 语句,但是这种优化有额外的开发成本,权衡后留空,不实现

if
	UE.UKismetMathLibrary.GreaterEqual_DoubleDouble(
		_GetAnimationCurrentTime_ReturnValue,
		0.47999998927116394
	) and (_GetAnimationCurrentTime_ReturnValue < 0.5199999809265137)
then
end

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

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

相关文章

Stlink固件更新问题“ST-Link is not in the dfu mode Please restart it“的解决方法

安装stlink utility&#xff1a;官网下载&#xff1a;https://www.st.com/content/st_com/zh.html在ST-LINK utility中连接芯片&#xff0c;提示仿真器版本过低&#xff0c;点击更新&#xff0c;报错提示&#xff1a;“ST LINK is not in the DFU mode plesse restart it”操作…

Day 6 Bean 的生命周期

建议浏览顺序从Day 1 开始。1 Bean的声明周期Spring Bean的生命周期是从 Bean 实例化之后&#xff0c;即通过反射创建出对象之后&#xff0c;到Bean成为一个完整对象&#xff0c;最终存储到单例池中&#xff0c;这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体…

ArcGIS JS API分页查询小结

如果遇到发布的服务要素非常多&#xff0c;比如点要素&#xff0c;此时如果想要查询相关的属性或几何信息&#xff0c;如果使用featurelayer的query方法&#xff0c;可能会遇到server后台返回数限制&#xff0c;而只能返回获取到返回数上限的要素数目。 一个简单的方法是&…

nginx学习笔记4(小d课堂)

linux服务器安装jdk和jar包上传 我们把我们的文件放到我们的路径下&#xff0c;这部分之前学过了&#xff0c;这里我们再来复习一遍。 然后我们去解压这个压缩包&#xff1a; 然后我们给这个文件改个名字&#xff1a; 然后我们要去配置环境变量&#xff1a; 在文件末尾加 然后我…

新库上线 | CnOpenDataA股上市公司招投标数据

A股上市公司招投标数据 一、数据简介 招投标是指在市场经济条件下进行大宗货物的买卖、工程建设项目的发包与承包以及服务项目的采购与提供时所采取的一种普遍交易方式。招标和投标是一种商品交易行为&#xff0c;是交易过程的两个方面。历经三十多年的发展&#xff0c;我国已…

resultType自动映射与结果映射resultMap

今天继续完善一下mybatis系列相关博客&#xff0c;以便查阅&#xff0c;同时也希望能帮助到有需要的小伙伴&#xff0c;各位看到此博客的小伙伴&#xff0c;如有不对的地方请及时通过私信我或者评论此博客的方式指出&#xff0c;以免误人子弟。多谢&#xff01; 这一篇记录一下…

week 9 吴恩达 迁移学习 多任务学习 端到端学习

文章目录一、错误分析二、快速构建系统然后迭代三、训练和测试的不同数据分布1、不匹配数据的偏差和方差2、解决数据不匹配问题。四、迁移学习 transfer learning五、多任务学习 multi-task learning六、端到端 end-to-end learning一、错误分析 当我们在构建一个系统时&#…

自动驾驶BEV火了,再给它加点脑洞会靠谱吗?

作者 | 洪泽鑫 编辑 | Bruce百度今年Create大会上辅助驾驶板块的内容挺硬核的&#xff0c;不在这个行业内基本听不懂。 正好是研究兴趣所在&#xff0c;结合百度给的资料&#xff0c;试着来中译中一下。 总的来说&#xff0c;百度是弄了一个车路一体的BEV感知方案——叫UniBEV。…

基于FPGA的UDP 通信(二)

引言前文链接&#xff1a;基于FPGA的UDP 通信&#xff08;一&#xff09;本文继续介绍与以太网数据协议相关的内容。以太网帧协议IEEE802.3标准规定了&#xff0c;以太网数据传输的格式&#xff1a;字段解释&#xff1a;字段名称字段长度/&#xff08;字节&#xff09;含义前导…

【MyBatis】第二篇:核心配置文件常用标签

前提 Mbatis的配置文件中的顺序如下&#xff1a; MyBatis核心配置文件中的标签必须安装指定的顺序配置。 (properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?…

SweetAlert让消息弹出窗口更加具有个性化!

SweetAlertSweetAlert是指可对JavaScript标准功能alert()和confirm()进行个性化定制的库。SweetAlert的要点官网上有很多示例&#xff0c;看了这些基本上就OK了。但是&#xff0c;在kintone上使用时&#xff0c;【弹出消息后更新页面】这个处理只参照示例来写的话&#xff0c;一…

微信小程序分包

1.什么是分包&#xff1f; 分包指的是把一个完整的小程序项目&#xff0c;按照需求划分为不同的子包&#xff0c;在构建时打包成不同的分包&#xff0c;用户在使用时按需进行加载。 2.分包的好处对小程序进行分包的好处主要有以下两点: 可以优化小程序首次启动的下载时间在多…

Elasticsearch 核心技术(四):索引管理、映射管理、文档管理(REST API)

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;大数据核心技术从入门到精通 文章目录一、索引管理1. 创建索引创建一个索引索引设置映射字段别名2. 获取索引3. 删除索…

阿拉伯数转中文与英文[找到规律,抽象问题,转换成代码]

阿拉伯数转中文与英文前言一、阿拉伯数字转换1、阿拉伯数字转中文a、案例b、解决方案2、阿拉伯数转英文a、案例b、解决方案总结参考文献前言 如果思考算法的解法方案是一种模拟&#xff0c;那么这一般不是个好的解决方案。对于一个复杂的问题&#xff0c;挖掘其中的规律&#…

制造业管理系统如何帮助企业快速应对品质异常问题?

在企业生产制造过程中&#xff0c;成品发生品质异常问题是不可避免的。当成品出现问题&#xff0c;为了有效防范批量品质事故&#xff0c;品管需要快速判断可能是哪个材料引起的&#xff0c;需要知道这批成品是谁做的&#xff0c;什么时候做的&#xff0c;提供材料的分别是哪个…

MySQL基础篇语句--DDL语句

SQL简介 当面对一个陌生的数据库时,通常需要一种方式与它交互&#xff0c;以完成用户所需要的各种工作&#xff0c;这个时候&#xff0c;就要用到SQL语言了。 SQL是Structure Query Language(结构化查询语言)的缩写&#xff0c;它是使用关系模型的数据库应用语言&#xff0c;由…

传统推荐模型(一)协同过滤算法_UserCF和ItemCF

传统推荐模型&#xff08;一&#xff09;协同过滤算法_UserCF 1、UserCF 协同过滤就是协同大家的反馈、评价和意见一起对海量的信息进行过滤&#xff0c;从中筛选出目标用户可能感兴趣的信息的推荐过程。 物品1物品2物品3物品4物品5用户131233用户243435用户333154用户41552…

OneNote(或印象笔记)迁移到Joplin的方法

2023年1月10日实操记录简介背景是必须卸载OneNote&#xff0c;所以要迁移笔记。告别了用了23年的Outlook &#xff0c;和10年左右的OneNote&#xff0c;小伤感&#xff0c;自此一别 就不能用练就的VBA技能在Excel和Access中处理数据了。。。基本前提Joplin支持.enex格式文件的导…

总结述职报告撰写方法,报告目的、对象、内容、技巧等

导语 又到年末时&#xff0c;述职报告再一次席卷而来。这篇文章将带来干货满满的述职报告撰写方法&#xff0c;包括述职目的、对象、内容、技巧等多个方面。 一、述职目的 有多少人认为&#xff0c;述职只是走个形式&#xff0c;走个过场的&#xff1f; 如果你这样认为&#x…

2023济南制药机械展|中国(济南)国际制药机械与包装技术展览会

2023中国&#xff08;济南&#xff09;国际制药机械与包装技术展览会将于2023年3月30-4月1日在山东国际会展中心&#xff08;济南市槐荫区日照路1号&#xff09;同期举办&#xff1a;2023第11届国际生物发酵展2023国际生化仪器与实验室装备展2023国际生物技术与生物制药展支持单…