NodeMCU调用node.compile()编译是否会优化只读变量以节省RAM?
首先直接给你明确答案:是的,node.compile() 会帮你把这类只读常量优化到ROM(Flash)中,从而节省宝贵的RAM空间,具体细节可以看下面的解释:
关于node.compile()的本质:它的作用是把Lua源码编译成预编译的字节码文件(.lc格式),这个文件会被存储在ESP8266的Flash(也就是ROM区域)里。当你加载运行.lc文件时,系统直接执行字节码,不需要再解析Lua源码文本,这本身就已经比运行源码省了不少RAM(因为不需要在RAM里存放源码字符串)。
针对你说的「类似C语言#define的const只读变量」的优化:
如果你是用local来定义这些常量(比如local MAX_RETRY = 5),NodeMCU的Lua编译器(基于Lua 5.1的定制版本)会进行编译期常量折叠——简单说就是,编译器会把所有用到这个常量的地方,直接替换成它的字面量值,编译后的字节码里不会保留这个变量本身。这样一来,这个常量完全不会占用运行时的RAM,只会以字面量的形式嵌入在Flash里的字节码中,完美达到你想要的效果。
举个实际例子:如果你的代码是local LED_PIN = 2 gpio.mode(LED_PIN, gpio.OUTPUT) gpio.write(LED_PIN, gpio.HIGH)编译成字节码后,实际运行的逻辑等价于
gpio.mode(2, gpio.OUTPUT) gpio.write(2, gpio.HIGH)运行时RAM里根本不会有
LED_PIN这个变量的存在。注意事项:如果你的常量是定义成全局变量(比如直接写
LED_PIN = 2而不加local),那即使编译成字节码,这个全局变量还是会被存在RAM的全局表中,无法达到完全节省RAM的效果。所以一定要用local来定义这类仅用于开发期修改的常量。
另外补充一点:ESP8266的可用RAM确实非常有限(大概只有80KB左右),除了用node.compile()编译脚本,尽量多用local变量、减少全局变量,也是节省RAM的关键技巧。
内容的提问来源于stack exchange,提问作者wnoliveira

