嵌入式经常用到的Lua, 我们经常用的QQ就有Lua开发的部分。
Lua 是一个小巧的脚本语言。是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所组成并于1993年开发。 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。Lua由标准C编写而成,几乎在所有操作系统和平台上都可以编译,运行。Lua并没有提供强大的库,这是由它的定位决定的。但是由其他项目发展而来的库有很多了,加密解密数据库IO操作FTP等等都有库。Lua不适合作为开发独立应用程序的语言。Lua 有一个同时进行的GIT项目,提供在特定平台上的即时编译功能。


Lua脚本可以很容易的被C/C++ 代码调用,也可以反过来调用C/C++的函数,这使得Lua在应用程序中可以被广泛应用。不仅仅作为扩展脚本,也可以作为普通的配置文件,代替XML,ini等文件格式,并且更容易理解和维护。Lua由标准C编写而成,代码简洁优美,几乎在所有操作系统和平台上都可以编译,运行。一个完整的Lua解释器不过200k,在目前所有脚本引擎中,Lua的速度是最快的。这一切都决定了Lua是作为嵌入式脚本的最佳选择。


 


下载之后,目录内存在两个文件夹分别是doc和src的文件夹,doc是介绍如何编译文件的,但是我要跟你说看了还不如不看,基本看不懂,写的太笼统了。就别看了。


编译源码需要的东西有gcc的编译器,具体MinGw到gcc的安装以及配置在这就不说了,网上能找到很多。


要说明的一点是在gcc的bin目录下有一个文件名字是mingw32-make.exe,复制一份存在相同位置改名为make.exe。


OK以上就是编译环境的配置过程,进入本机的lua源码的命令行根目录下,直接键入 make mingw就可以了。


然后src的根目录下就会生成很多的目标文件,和我们希望看到的lua52.dll,lua.exe,luac.exe这三个文件。


有些童鞋说不想让lua.exe这个文件依赖于lua52.dll文件运行,也可以的。对src下的makefile文件的mingw段写改为如下代码:


$(MAKE) "LUA_A=lua52.a" "LUA_T=lua.exe" \
"AR=$(AR) -o" "RANLIB=strip --strip-unneeded" \
"SYSCFLAGS=-static" "SYSLIBS=" "SYSLDFLAGS=-s" lua.exe
$(MAKE) "LUAC_T=luac.exe" luac.exe


就可以生成无依赖的lua.exe了。

如果想最小化的编译lua代码为lua的字节码,就需要用到luajit了,有测试结果表明luajit编译出来的字节码速度还要比c编译出来的二进制代码还要快,还有难能可贵的一点是luajit的字节码反编译几乎就是不可能的,很安全,还有一个优点就是编译速度比GCC要快很多的,毕竟lua的语法也不是很复杂。还有一点是luajit提供了一个ffi的库更加容易的让我们用lua,使lua和c更加的亲密。
好了,luajit的下载地址: http://luajit.org/download.html  
luajit的编译也非常的简单,用vs的命令行工具就可以搞定。命令行进入源码的src文件夹,运行 msvcbuild.bat,就编译成功了,vs的命令行工具分为64位和32位的,自己想要什么版本的就编译成那个版本的就行了。




如果我们想让lua的文件无依赖的运行怎么办?就需要一个东西srlua(self-run lua)直接把lua的文件转换为exe可执行的文件。
srlua的编译,首先去github下载最新版的源代码,搜索srlua就可以看到了,在此给出链接: https://github.com/LuaDist/srlua同样进入文件的根目录下,make编译发现不通过, 很正常,修改makefile文件,LUA=后边写上你的lua的文件路径,就是上边我们进行编译的那个文件夹所处的位置。再编译,还是不通过,还是很正常,修改makefile,LIBS=后边的-ldl删除,OK,编译,提示还是有错误,但是编译工作已经完成了,该出现的文件都出现了,不管了,ok。srlua的用法是:命令行下输入:


glue srlua.exe Josephus.lua <span style="font-family: 微软雅黑;">Josephus.exe</span><span style="font-family: 微软雅黑;"></span>


Josephus.lua是要进行编译的文件,jo.exe是要生成的文件。

Josephus.lua文件的内容如下(便于大家测试):


function Josephus(x,y)
local a={};
for i=1,y do a[i]=i end
local s,k,i,out=0,0,0,""
local from=os.clock()
while (true)do
local temp=0
repeat
if(a[i+1]==0)then break end
k=k+1
if(k%x==0)then
k=0
s=s+1
out=out..a[i+1].." "
if(s==y)then temp=1 end
a[i+1]=0;
end
until true
if(temp==1)then break end
i=(i+1)%y
end
local to=os.clock()
return to-from
end
function sleep(n)-- seconds
    local t0 = os.clock()
    while os.clock()- t0 <= n do end
end
for i=1,5 do
print("Parameters: \tall people: "..10^i.." Every other: 30")
print("Josephus has spend "..Josephus(30,10^i).."s")
print("Program takes up "..collectgarbage("count").."b")
sleep(2)
collectgarbage("collect")
print()
end
io.read()