因为lua在不开启JIT的情况下是解释运行,也就是通过软件cpu来执行这些代码,而模拟器代码在提交的时候已经通过了appstore之类的审核是可以被cpu执行的,你热更的lua脚本只是一种数据,被模拟器加载了而已,因此不会被No eXecute bit技术所限制。
手游行业使用Lua热更是因为ios系统的限制,如果仅仅考虑Android系统,通常使用Unity进行游戏开发,对待代码方面的更新,完全可以使用动态链接库,不用Lua也是可以的。但是一旦考虑到ios系统就不行了。
首先c#这种语言编写的程序在运行前,会先编译成中间语言,运行时clr会根据硬件特性,将中间语言解释为机器码,然后申请一块可读写可执行的内存,之前翻译的结果复制过去,指令指针指过去就能运行,这里ios限制了申请的内存权限不可执行所以gg。
热更的原理很简单,将需要替换或者新增的二进制代码和资源加载到内存,然后运行他,这种事情在windows上有很多方便的方式(例如dll)实现,而在Android虽然没有直接提供简单的方式仍然可以将动态链接库(so)当作数据读入到内存,然后执行之。
但是,作为没有越狱的ios系统,苹果因为安全或者其他原因,启动了CPU的No eXecute bit,大致就是将appstore审核过的代码加入签名文件,然后ios运行app的时候会为appstore审核过的代码开辟专用的内存空间,而其他app中的数据或者通过代码从线上下载的数据加载的时候会将存放的内存空间定义描述符定义为禁止运行,这样ip寄存器将不能够跳转到该空间,因此这部分代码不能运行。这种安全技术应该在某些系统(比如安全要求很高的银行计算机,猜测)也是使用的的,不过一般我们接触到的电子产品也就只有ios使用了这种技术(不知道游戏主机有没有使用,木有玩过主机)
而为什么lua等脚本语言可以热更,因为lua在不开启JIT的情况下是解释运行,也就是通过软件cpu来执行这些代码,而模拟器代码在提交的时候已经通过了appstore之类的审核是可以被cpu执行的,你热更的lua脚本只是一种数据,被模拟器加载了而已,因此不会被No eXecute bit技术所限制。
延伸阅读:
什么是脚本语言?
文章标题:为什么解释型的脚本语言(如Lua、Python)可以热更新,而编译型的语言(如C、C++)不能呢,发布者:小编,转载请注明出处:https://worktile.com/kb/p/39233