Lua 是一個小巧的腳本語言。是巴西里約熱內盧天主教大學(Pontifical Catholic University of Rio de Janeiro)裏的一個研究小組,由Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo所組成並於1993年開發。 其設計目的是爲了嵌入應用程序中,從而爲應用程序提供靈活的擴展和定製功能。Lua由標準C編寫而成,幾乎在全部操做系統和平臺上均可以編譯,運行。Lua並無提供強大的庫,這是由它的定位決定的。因此Lua不適合做爲開發獨立應用程序的語言。Lua 有一個同時進行的JIT項目,提供在特定平臺上的即時編譯功能。
Lua腳本能夠很容易的被C/C++ 代碼調用,也能夠反過來調用C/C++的函數,這使得Lua在應用程序中能夠被普遍應用。不只僅做爲擴展腳本,也能夠做爲普通的配置文件,代替XML,ini等文件格式,而且更容易理解和維護。[1] Lua由標準C編寫而成,代碼簡潔優美,幾乎在全部操做系統和平臺上均可以編譯,運行。 一個完整的Lua解釋器不過200k,在目前全部腳本引擎中,Lua的速度是最快的。這一切都決定了Lua是做爲嵌入式腳本的最佳選擇。程序員
運行能夠經過 Lua 的交互模式,也能夠用記事本編輯代碼保存爲 .lua 的格式,經過 lua 編譯器運行。也能夠經過第三方工具,將 lua 打包獨立運行。編程
Lua的目標是成爲一個很容易嵌入其它語言中使用的語言。大多數程序員也認爲它的確作到了這一點。
不少應用程序、遊戲使用LUA做爲本身的嵌入式腳本語言,以此來實現可配置性、可擴展性。這其中包括魔獸世界、博德之門、憤怒的小鳥、VOCALOID三、太陽神三國殺 等。windows
輕量級
輕量級Lua語言的官方版本只包括一個精簡的核心和最基本的庫。這使得Lua體積小、啓動速度快,從而適合嵌入在別的程序裏。5.0.2版的Lua的內核小於120KB,而Python的內核大約860KB,Perl的內核大約1.1MB。[2]
可擴展
可擴展 Lua並不象其它許多"大而全"的語言那樣,包括不少功能,好比網絡通信、圖形界面等。可是Lua提供了很是易於使用的擴展接口和機制:由宿主語言(一般是C或C++)提供這些功能,Lua可使用它們,就像是原本就內置的功能同樣。
其它特性
Lua還具備其它一些特性:同時支持面向過程(procedure-oriented)編程和函數式編程(functional programming);自動內存管理;只提供了一種通用類型的表(table),用它能夠實現數組,哈希表,集合,對象;語言內置模式匹配;閉包(closure);函數也能夠看作一個值;提供多線程(協同進程 [3] ,並不是操做系統所支持的線程)支持;經過閉包和table能夠很方便地支持面向對象編程所須要的一些關鍵機制,好比數據抽象,虛函數,繼承和重載等。數組
1
|
print"Hello,world!"
|
1
2
3
4
5
6
7
|
function create_a_counter()
local count=0
return function()
count = count + 1
return count
end
end
|
1
|
void
lua_getglobal(lua_State *L,
const
char
*name)
|
1
2
|
lua_tonumber返回的是double
lua_tostring返回的是char*
|
1
|
lua_pushstring(L, "i");
|
1
2
3
4
5
6
7
8
9
|
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
|
1
|
x,y = Test()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
lua_newtable(L);
//建立一個表格,放在棧頂
lua_pushstring(L,
"mydata"
);
//壓入key
lua_pushnumber(L,66);
//壓入value
lua_settable(L,-3);
//彈出key,value,並設置到table裏面去
lua_pushstring(L,
"subdata"
);
//壓入key
lua_newtable(L);
//壓入value,也是一個table
lua_pushstring(L,
"mydata"
);
//壓入subtable的key
lua_pushnumber(L,53);
valuelua_settable(L,-3);
//彈出key,value,並設置到subtable
lua_settable(L,-3);
//這時候父table的位置仍是-3,彈出key,value(subtable),
//並設置到table裏去
lua_pushstring(L,
"mydata2"
);
//同上
lua_pushnumber(L,77);
lua_settable(L,-3);
return1;
//棧裏如今就一個table其餘都被彈掉了。若是要返回一個數組,
//用以下代碼:(注意那個關於trick的註釋,我在等官方的解釋。
//通過驗證,這個問題只在windows版本調用dll中方法的時候出現。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);
|
1
2
3
4
|
for
i,v ini pairs(data.arri)
do
print(v)
end
|
1
2
3
4
|
for
i=1,table.getn(data.arri)
do
print(data.arri)
end
|
1
2
3
4
5
6
7
8
9
10
|
typedef
enum
{BR_9600,BR_4800,}BaudRate;
typedef
struct
flag
{
int
onoff;
int
j;
long
l;
double
d;
char
*name;
BaudRate rate;
}flag;
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
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;
}
|
Minecraft中的電腦模組(ComputerCraft)
全部的爲電腦和turtle(機器人)的代碼都是基於Lua的,你能夠用它們與有(無)線路由器、打印機、磁盤驅動器、(黃金)顯示器互動。
Adobe Photoshop Lightroom
Lightroom是Adobe公司的一款攝影后期製做軟件,最開始的版本由Shadowland代碼編寫,後期版本部分使用Lua實現,Lua代碼佔到代碼總量的63%。
金庸羣俠傳lua復刻版
這個遊戲,遊戲迷們想必都玩過了。牛人用lua腳本從新弄了下。
魔獸世界
他的插件用的也是lua。
仙劍奇俠傳五
解壓遊戲到資源目錄能夠看到遊戲到腳本所有是使用Lua語言編寫的。網絡