lua for windows(lua開(kāi)發(fā)環(huán)境)
詳情介紹
Lua是一個(gè)小巧的腳本語(yǔ)言,標(biāo)準(zhǔn) C 編寫(xiě)而成,它可以被 C/C++ 代碼調(diào)用,也可以反過(guò)來(lái)調(diào)用 C/C++ 的函數(shù),幾乎在所有操作系統(tǒng)和平臺(tái)上都可以編譯、運(yùn)行。Lua 并沒(méi)有提供強(qiáng)大的庫(kù),一個(gè)完整的 Lua 解釋器不過(guò) 200KB,但它在所有腳本引擎中速度是最快的,是作為嵌入式腳本的最佳選擇,這樣更容易讓用戶進(jìn)行理解和維護(hù)。
輕量級(jí)Lua語(yǔ)言的官方版本只包括一個(gè)精簡(jiǎn)的核心和最基本的庫(kù)。這使得Lua體積小、啟動(dòng)速度快,從而適合嵌入在別的程序里。
2、可擴(kuò)展
可擴(kuò)展 Lua并不象其它許多"大而全"的語(yǔ)言那樣,包括很多功能,比如網(wǎng)絡(luò)通訊、圖形界面等。但是Lua提供了非常易于使用的擴(kuò)展接口和機(jī)制:由宿主語(yǔ)言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來(lái)就內(nèi)置的功能一樣。
3、其它特性
Lua還具有其它一些特性:同時(shí)支持面向過(guò)程(procedure-oriented)編程和函數(shù)式編程(functional programming);自動(dòng)內(nèi)存管理;只提供了一種通用類型的表(table),用它可以實(shí)現(xiàn)數(shù)組,哈希表,集合,對(duì)象;語(yǔ)言內(nèi)置模式匹配;閉包(closure);函數(shù)也可以看做一個(gè)值;提供多線程(協(xié)同進(jìn)程,并非操作系統(tǒng)所支持的線程)支持;通過(guò)閉包和table可以很方便地支持面向?qū)ο缶幊趟枰囊恍╆P(guān)鍵機(jī)制,比如數(shù)據(jù)抽象,虛函數(shù),繼承和重載等。
獨(dú)立應(yīng)用腳本
Web 應(yīng)用腳本
擴(kuò)展和數(shù)據(jù)庫(kù)插件如:MySQL Proxy 和 MySQL WorkBench
安全系統(tǒng),如入侵檢測(cè)系統(tǒng)
print"Hello,world!"
一個(gè)比較復(fù)雜一點(diǎn)的例子,但是它展示了什么是閉包:
function create_a_counter()
local count=0
return function()
count = count + 1
return count
end
end
create_a_counter()返回一個(gè)記數(shù)器,每次調(diào)用這個(gè)記數(shù)器,都會(huì)得到一個(gè)比上次大1的值。
注意:調(diào)用的時(shí)候,如果你的調(diào)用是這樣的的:
print(create_a_counter())
那么每次輸出是一樣的結(jié)果,沒(méi)有計(jì)數(shù)的效果,只會(huì)輸出計(jì)數(shù)器的地址,應(yīng)該這樣調(diào)用:
ct = create_a_counter()
print(ct()) --輸出> 1
print(ct()) --輸出> 2
數(shù)據(jù)交換
介紹
Lua和C程序通過(guò)一個(gè)棧交換數(shù)據(jù): struct lua_State
棧的序號(hào)可以從棧頂和棧底計(jì)數(shù),從棧底計(jì)數(shù),則棧底是1,向棧頂方向遞增。從棧頂計(jì)數(shù),則棧頂是-1,向棧底方向遞減。一般都用從棧底計(jì)數(shù)的方式。棧的默認(rèn)大小是20,可以用lua_checkstack修改.用lua_gettop則可以獲得棧里的元素?cái)?shù)目。并不是說(shuō)在棧頂有一個(gè)整形元素。而是計(jì)算了一下棧頂元素在棧里的正index,相當(dāng)于元素?cái)?shù)目。
Lua 調(diào)用C函數(shù)用的棧是臨時(shí)的,調(diào)用結(jié)束之后就被銷毀了。
如何從棧中獲取從Lua腳本中的參數(shù)
如果知道Lua腳本中某個(gè)全局變量的名字,可以用
void lua_getglobal(lua_State *L, const char *name)
這個(gè)函數(shù)會(huì)將name所指Lua變量的值放在棧頂.
如果是在C 函數(shù)中要獲取Lua調(diào)用函數(shù)使用的參數(shù):
首先用lua_gettop檢查參數(shù)數(shù)量
用lua_is 類函數(shù)檢測(cè)參數(shù)的類型,做好錯(cuò)誤處理
用lua_to 類函數(shù)將參數(shù)轉(zhuǎn)換為number或者string。(對(duì)Lua來(lái)說(shuō),只有這兩種簡(jiǎn)單類型)
lua_tonumber返回的是double
lua_tostring返回的是char*
用lua_remove從棧中刪除掉元素
繼續(xù)獲取下一個(gè)元素。 因?yàn)槊看味颊{(diào)用lua_remove,所以每次調(diào)用lua_tonumber,使用的index都將固定是-1,即棧頂。
如果lua_istable成立,那么說(shuō)明棧頂是一個(gè)table 注意 tabl e是不能取出來(lái)的,只能把 table 里的元素一個(gè)個(gè)取出來(lái)。
首先把元素的名字壓入棧頂:
lua_pushstring(L, "i");
然后就可以用lua_gettable調(diào)用,值會(huì)放在棧頂。同時(shí)剛才壓入的元素名字被彈出。用上面的辦法,可以把這個(gè)值取出來(lái)。記得也應(yīng)該lua_remove。 如果table的某一個(gè)元素也是table,重復(fù)即可。當(dāng)table的所有元素都取完了,記住這個(gè)table本身還在棧里,要用lua_remove把它刪除。
如果要獲取的是一個(gè)數(shù)組(所謂數(shù)組,其實(shí)就是key是從1開(kāi)始的數(shù)字序列的table,并且值類型相同),用lua_next可以遍歷這個(gè)數(shù)組:
首先lua_pushnil,壓入一個(gè)空值,然后
while(lua_next(L, -2)!=0)
{
if(lua_isnumber(L, -1))//判斷元素類型,也可能是string
{
arrf.add((float)lua_tonumber(L, -1));//獲取元素的值
lua_remove(L, -1);
}
}
lua_remove(L,-1);//刪除NIL
如何從C返回?cái)?shù)據(jù)給Lua腳本
用 lua_push 類函數(shù)壓入數(shù)據(jù)到棧中,并用return n;來(lái)告訴Lua返回了幾個(gè)返回值。 Lua是天生支持多個(gè)返回值的,如
x,y = Test()
Lua會(huì)根據(jù)n從棧里取相應(yīng)的數(shù)據(jù)。
如果要返回一個(gè)table:
lua_newtable(L);//創(chuàng)建一個(gè)表格,放在棧頂
lua_pushstring(L,"mydata"); //壓入key
lua_pushnumber(L,66);//壓入value
lua_settable(L,-3);//彈出key,value,并設(shè)置到table里面去
lua_pushstring(L,"subdata");//壓入key
lua_newtable(L);//壓入value,也是一個(gè)table
lua_pushstring(L,"mydata"); //壓入subtable的key
lua_pushnumber(L,53);
valuelua_settable(L,-3);//彈出key,value,并設(shè)置到subtable
lua_settable(L,-3);//這時(shí)候父table的位置還是-3,彈出key,value(subtable),
//并設(shè)置到table里去
lua_pushstring(L,"mydata2");//同上
lua_pushnumber(L,77);
lua_settable(L,-3);
return1;
//棧里現(xiàn)在就一個(gè)table其他都被彈掉了。如果要返回一個(gè)數(shù)組,
//用如下代碼:(注意那個(gè)關(guān)于trick的注釋,我在等官方的解釋。
//經(jīng)過(guò)驗(yàn)證,這個(gè)問(wèn)題只在windows版本調(diào)用dll中方法的時(shí)候出現(xiàn)。WinCE正常)
lua_pushstring(L,"arri");
lua_newtable(L);
{
//atrick:otherwisetheluaenginewillcrash.ThiselementisinvisibleinLuascript
lua_pushnumber(L,-1);
lua_rawseti(L,-2,0);
for(int i=0; i<arri.size(); i++)
{
lua_pushnumber(L, arri);
lua_rawseti(L, -2, i+1);
}
}
lua_settable(L,-3);
這樣產(chǎn)生的數(shù)組可以在Lua中如下遍歷:
for i,v ini pairs(data.arri)
do
print(v)
end
或者是
for i=1,table.getn(data.arri)
do
print(data.arri)
end
只有數(shù)組才能這樣,name,value構(gòu)成的Record不行,table.getn也只對(duì)數(shù)組有效。
由于上述代碼的高度相似性,所以很容易實(shí)現(xiàn)自動(dòng)生成這些代碼。比如,根據(jù)C的一個(gè)struct定義:
typedef enum{BR_9600,BR_4800,}BaudRate;
typedef struct flag
{
intonoff;
intj;
longl;
doubled;
char*name;
BaudRaterate;
}flag;
可以自動(dòng)產(chǎn)生如下代碼:
bool DataToLua(flagdata, lua_State*L)
{
lua_newtable(L);
lua_pushstring(L, "onoff");
lua_pushnumber(L, double)data.onoff);
lua_settable(L, -3);
lua_pushstring(L, "j");
lua_pushnumber(L, (double)data.j);
lua_settable(L, -3);
lua_pushstring(L, "l");
lua_pushnumber(L, (double)data.l);
lua_settable(L, -3);
lua_pushstring(L, "d");
lua_pushnumber(L, double)data.d);
lua_settable(L, -3);
lua_pushstring(L, "name");
lua_pushstring(L, data.name.c_str());
lua_settable(L, -3);
lua_pushstring(L, "rate");
lua_pushnumber(L, (double)(int)data.rate);
lua_settable(L, -3);
return true;
}
LuaToData也是類似的。
如果使用面向?qū)ο蟮姆绞椒庋b起flag來(lái),把DataToLua變成flag類的一個(gè)方法,就更加方便了。
所有的為電腦和turtle(機(jī)器人)的代碼都是基于Lua的,你可以用它們與有(無(wú))線路由器、打印機(jī)、磁盤(pán)驅(qū)動(dòng)器、(黃金)顯示器互動(dòng)。
Adobe Photoshop Lightroom
Lightroom是Adobe公司的一款攝影后期制作軟件,最開(kāi)始的版本由Shadowland代碼編寫(xiě),后期版本部分使用Lua實(shí)現(xiàn),Lua代碼占到代碼總量的63%。
金庸群俠傳lua復(fù)刻版
這個(gè)游戲,游戲迷們想必都玩過(guò)了。牛人用lua腳本重新弄了下。
魔獸世界
他的插件用的也是lua。
仙劍奇?zhèn)b傳五
解壓游戲到資源目錄可以看到游戲到腳本全部是使用Lua語(yǔ)言編寫(xiě)的。
Garry's Mod
這個(gè)游戲的所有創(chuàng)意工坊插件都是由LUA腳本編寫(xiě)的。
Don't Starve(饑荒)
Klei 開(kāi)發(fā)的一款動(dòng)作冒險(xiǎn)類求生游戲,于2013年4月23日在PC上發(fā)行。游戲及所有創(chuàng)意工坊插件都是由LUA腳本編寫(xiě)的。
lua for windows(lua開(kāi)發(fā)環(huán)境)特性
1、輕量級(jí)輕量級(jí)Lua語(yǔ)言的官方版本只包括一個(gè)精簡(jiǎn)的核心和最基本的庫(kù)。這使得Lua體積小、啟動(dòng)速度快,從而適合嵌入在別的程序里。
2、可擴(kuò)展
可擴(kuò)展 Lua并不象其它許多"大而全"的語(yǔ)言那樣,包括很多功能,比如網(wǎng)絡(luò)通訊、圖形界面等。但是Lua提供了非常易于使用的擴(kuò)展接口和機(jī)制:由宿主語(yǔ)言(通常是C或C++)提供這些功能,Lua可以使用它們,就像是本來(lái)就內(nèi)置的功能一樣。
3、其它特性
Lua還具有其它一些特性:同時(shí)支持面向過(guò)程(procedure-oriented)編程和函數(shù)式編程(functional programming);自動(dòng)內(nèi)存管理;只提供了一種通用類型的表(table),用它可以實(shí)現(xiàn)數(shù)組,哈希表,集合,對(duì)象;語(yǔ)言內(nèi)置模式匹配;閉包(closure);函數(shù)也可以看做一個(gè)值;提供多線程(協(xié)同進(jìn)程,并非操作系統(tǒng)所支持的線程)支持;通過(guò)閉包和table可以很方便地支持面向?qū)ο缶幊趟枰囊恍╆P(guān)鍵機(jī)制,比如數(shù)據(jù)抽象,虛函數(shù),繼承和重載等。
lua應(yīng)用場(chǎng)景
游戲開(kāi)發(fā)獨(dú)立應(yīng)用腳本
Web 應(yīng)用腳本
擴(kuò)展和數(shù)據(jù)庫(kù)插件如:MySQL Proxy 和 MySQL WorkBench
安全系統(tǒng),如入侵檢測(cè)系統(tǒng)
lua示例代碼
是的,你猜對(duì)了:Hello,world!print"Hello,world!"
一個(gè)比較復(fù)雜一點(diǎn)的例子,但是它展示了什么是閉包:
function create_a_counter()
local count=0
return function()
count = count + 1
return count
end
end
create_a_counter()返回一個(gè)記數(shù)器,每次調(diào)用這個(gè)記數(shù)器,都會(huì)得到一個(gè)比上次大1的值。
注意:調(diào)用的時(shí)候,如果你的調(diào)用是這樣的的:
print(create_a_counter())
那么每次輸出是一樣的結(jié)果,沒(méi)有計(jì)數(shù)的效果,只會(huì)輸出計(jì)數(shù)器的地址,應(yīng)該這樣調(diào)用:
ct = create_a_counter()
print(ct()) --輸出> 1
print(ct()) --輸出> 2
數(shù)據(jù)交換
介紹
Lua和C程序通過(guò)一個(gè)棧交換數(shù)據(jù): struct lua_State
棧的序號(hào)可以從棧頂和棧底計(jì)數(shù),從棧底計(jì)數(shù),則棧底是1,向棧頂方向遞增。從棧頂計(jì)數(shù),則棧頂是-1,向棧底方向遞減。一般都用從棧底計(jì)數(shù)的方式。棧的默認(rèn)大小是20,可以用lua_checkstack修改.用lua_gettop則可以獲得棧里的元素?cái)?shù)目。并不是說(shuō)在棧頂有一個(gè)整形元素。而是計(jì)算了一下棧頂元素在棧里的正index,相當(dāng)于元素?cái)?shù)目。
Lua 調(diào)用C函數(shù)用的棧是臨時(shí)的,調(diào)用結(jié)束之后就被銷毀了。
如何從棧中獲取從Lua腳本中的參數(shù)
如果知道Lua腳本中某個(gè)全局變量的名字,可以用
void lua_getglobal(lua_State *L, const char *name)
這個(gè)函數(shù)會(huì)將name所指Lua變量的值放在棧頂.
如果是在C 函數(shù)中要獲取Lua調(diào)用函數(shù)使用的參數(shù):
首先用lua_gettop檢查參數(shù)數(shù)量
用lua_is 類函數(shù)檢測(cè)參數(shù)的類型,做好錯(cuò)誤處理
用lua_to 類函數(shù)將參數(shù)轉(zhuǎn)換為number或者string。(對(duì)Lua來(lái)說(shuō),只有這兩種簡(jiǎn)單類型)
lua_tonumber返回的是double
lua_tostring返回的是char*
用lua_remove從棧中刪除掉元素
繼續(xù)獲取下一個(gè)元素。 因?yàn)槊看味颊{(diào)用lua_remove,所以每次調(diào)用lua_tonumber,使用的index都將固定是-1,即棧頂。
如果lua_istable成立,那么說(shuō)明棧頂是一個(gè)table 注意 tabl e是不能取出來(lái)的,只能把 table 里的元素一個(gè)個(gè)取出來(lái)。
首先把元素的名字壓入棧頂:
lua_pushstring(L, "i");
然后就可以用lua_gettable調(diào)用,值會(huì)放在棧頂。同時(shí)剛才壓入的元素名字被彈出。用上面的辦法,可以把這個(gè)值取出來(lái)。記得也應(yīng)該lua_remove。 如果table的某一個(gè)元素也是table,重復(fù)即可。當(dāng)table的所有元素都取完了,記住這個(gè)table本身還在棧里,要用lua_remove把它刪除。
如果要獲取的是一個(gè)數(shù)組(所謂數(shù)組,其實(shí)就是key是從1開(kāi)始的數(shù)字序列的table,并且值類型相同),用lua_next可以遍歷這個(gè)數(shù)組:
首先lua_pushnil,壓入一個(gè)空值,然后
while(lua_next(L, -2)!=0)
{
if(lua_isnumber(L, -1))//判斷元素類型,也可能是string
{
arrf.add((float)lua_tonumber(L, -1));//獲取元素的值
lua_remove(L, -1);
}
}
lua_remove(L,-1);//刪除NIL
如何從C返回?cái)?shù)據(jù)給Lua腳本
用 lua_push 類函數(shù)壓入數(shù)據(jù)到棧中,并用return n;來(lái)告訴Lua返回了幾個(gè)返回值。 Lua是天生支持多個(gè)返回值的,如
x,y = Test()
Lua會(huì)根據(jù)n從棧里取相應(yīng)的數(shù)據(jù)。
如果要返回一個(gè)table:
lua_newtable(L);//創(chuàng)建一個(gè)表格,放在棧頂
lua_pushstring(L,"mydata"); //壓入key
lua_pushnumber(L,66);//壓入value
lua_settable(L,-3);//彈出key,value,并設(shè)置到table里面去
lua_pushstring(L,"subdata");//壓入key
lua_newtable(L);//壓入value,也是一個(gè)table
lua_pushstring(L,"mydata"); //壓入subtable的key
lua_pushnumber(L,53);
valuelua_settable(L,-3);//彈出key,value,并設(shè)置到subtable
lua_settable(L,-3);//這時(shí)候父table的位置還是-3,彈出key,value(subtable),
//并設(shè)置到table里去
lua_pushstring(L,"mydata2");//同上
lua_pushnumber(L,77);
lua_settable(L,-3);
return1;
//棧里現(xiàn)在就一個(gè)table其他都被彈掉了。如果要返回一個(gè)數(shù)組,
//用如下代碼:(注意那個(gè)關(guān)于trick的注釋,我在等官方的解釋。
//經(jīng)過(guò)驗(yàn)證,這個(gè)問(wèn)題只在windows版本調(diào)用dll中方法的時(shí)候出現(xiàn)。WinCE正常)
lua_pushstring(L,"arri");
lua_newtable(L);
{
//atrick:otherwisetheluaenginewillcrash.ThiselementisinvisibleinLuascript
lua_pushnumber(L,-1);
lua_rawseti(L,-2,0);
for(int i=0; i<arri.size(); i++)
{
lua_pushnumber(L, arri);
lua_rawseti(L, -2, i+1);
}
}
lua_settable(L,-3);
這樣產(chǎn)生的數(shù)組可以在Lua中如下遍歷:
for i,v ini pairs(data.arri)
do
print(v)
end
或者是
for i=1,table.getn(data.arri)
do
print(data.arri)
end
只有數(shù)組才能這樣,name,value構(gòu)成的Record不行,table.getn也只對(duì)數(shù)組有效。
由于上述代碼的高度相似性,所以很容易實(shí)現(xiàn)自動(dòng)生成這些代碼。比如,根據(jù)C的一個(gè)struct定義:
typedef enum{BR_9600,BR_4800,}BaudRate;
typedef struct flag
{
intonoff;
intj;
longl;
doubled;
char*name;
BaudRaterate;
}flag;
可以自動(dòng)產(chǎn)生如下代碼:
bool DataToLua(flagdata, lua_State*L)
{
lua_newtable(L);
lua_pushstring(L, "onoff");
lua_pushnumber(L, double)data.onoff);
lua_settable(L, -3);
lua_pushstring(L, "j");
lua_pushnumber(L, (double)data.j);
lua_settable(L, -3);
lua_pushstring(L, "l");
lua_pushnumber(L, (double)data.l);
lua_settable(L, -3);
lua_pushstring(L, "d");
lua_pushnumber(L, double)data.d);
lua_settable(L, -3);
lua_pushstring(L, "name");
lua_pushstring(L, data.name.c_str());
lua_settable(L, -3);
lua_pushstring(L, "rate");
lua_pushnumber(L, (double)(int)data.rate);
lua_settable(L, -3);
return true;
}
LuaToData也是類似的。
如果使用面向?qū)ο蟮姆绞椒庋b起flag來(lái),把DataToLua變成flag類的一個(gè)方法,就更加方便了。
lua使用項(xiàng)目
Minecraft中的電腦模組(ComputerCraft)所有的為電腦和turtle(機(jī)器人)的代碼都是基于Lua的,你可以用它們與有(無(wú))線路由器、打印機(jī)、磁盤(pán)驅(qū)動(dòng)器、(黃金)顯示器互動(dòng)。
Adobe Photoshop Lightroom
Lightroom是Adobe公司的一款攝影后期制作軟件,最開(kāi)始的版本由Shadowland代碼編寫(xiě),后期版本部分使用Lua實(shí)現(xiàn),Lua代碼占到代碼總量的63%。
金庸群俠傳lua復(fù)刻版
這個(gè)游戲,游戲迷們想必都玩過(guò)了。牛人用lua腳本重新弄了下。
魔獸世界
他的插件用的也是lua。
仙劍奇?zhèn)b傳五
解壓游戲到資源目錄可以看到游戲到腳本全部是使用Lua語(yǔ)言編寫(xiě)的。
Garry's Mod
這個(gè)游戲的所有創(chuàng)意工坊插件都是由LUA腳本編寫(xiě)的。
Don't Starve(饑荒)
Klei 開(kāi)發(fā)的一款動(dòng)作冒險(xiǎn)類求生游戲,于2013年4月23日在PC上發(fā)行。游戲及所有創(chuàng)意工坊插件都是由LUA腳本編寫(xiě)的。
下載地址
- 電腦版
lua for windows(lua開(kāi)發(fā)環(huán)境) v5.4.6官方版
- 本地下載通道:
- 浙江電信下載
- 北京聯(lián)通下載
- 江蘇電信下載
- 廣東電信下載
同類軟件
網(wǎng)友評(píng)論
共0條評(píng)論(您的評(píng)論需要經(jīng)過(guò)審核才能顯示)