• 做一个幸福的人,读书,旅行,努力工作,关心身体和心情。
  • 不管有没有人爱,也要努力做一个可爱的人。不埋怨谁,不嘲笑谁,也不羡慕谁,阳光下灿烂,风雨中奔跑,做自己的梦,走自己的路。

如何将Lua代码编译成二进制代码

Lua编程 lcq 5年前 (2013-10-12) 694次浏览 0个评论

Lua虚拟机“在运行任何代码之前,Lua都会把源代码翻译(预编译)成一种内部的格式。这种格式是一个虚拟机指令序列,与真实的CPU所执行的机器码类似。之后,这个内部格式将会被由一个包含巨大的switch结构的while循环组成的C代码解释执行,switch中的每个case对应一条指令。”[摘自“Lua性能优化技巧”]。

在X2上面运行Lua代码的时候,能够很明显的感觉到,在加载Lua代码之后,需要经过数秒之后才能进入游戏。很明显,这个过程花在加载Lua代码与Lua虚拟机将Lua大吗翻译成内部格式的过程。为了跳过这个过程,我们需要事先将Lua源码翻译成虚拟机加载后就能运行的代码。

Lua虚拟机的C代码已经提供了该功能函数。在Lua虚拟机的C代码中,lua.c文件中main函数提供了解释器。在luac.c文件中的main函数提供了字节码编译器。luac.c文件中的main函数代码如下所示:

结果分析,文件的路径由main函数的char* argv[]函数传入,在Visual Studio 2010上将文件名作为main函数的参数传入设置如下图所示:

具体操作步骤为:在项目上单机鼠标右键,点“属性”,弹出如图“属性页”,展开“配置属性”下的“调试”项,在命令参数里面输入文件路径与文件名(将文件放在与工程目录下,输入文件名即可)。

运行Lua虚拟机,在工程目录下面会生成一个“luac.out”的二进制文件,这就是经Lua虚拟机翻译后的Lua指令。

由于我需要将一个应用程序的Lua代码编译成Lua二进制码文件,所以不能使用命令参数的形式将Lua文件名传递给WinMain函数(应用程序的入口函数为WinMain)。所以我需要封装一个函数来模拟main函数,同时将文件名以手动的方式传入我封装好的函数,为了做到代码量的最小修改,我将传入的文件名的字符串直接复制给char* argv[]。

经过打断点,使用命令参数传入文件名的方式传递给main函数char* argv[]参数截图显示如下:

所以,需要封装的函数可设计为:

经过测试,argv[0]参数不影响Lua解释器将代码编译成Lua指令。

LuaToBirnaryFile函数代码如下:

这样调用起来就很方便了,不要通过上面的设置来传入文件名了。

经过Lua编译器编译过后的代码,在X2上运行果然很快就能进入游戏了。

附注:本文所说的Lua解释器指的是Lua官网的5.2.2版本的解释器。下载地址为:Lua5.2.2


乐趣公园 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明如何将Lua代码编译成二进制代码
喜欢 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址