眼見為實(shí),耳聽為虛,先上live demo:
http://luajs.org
其實(shí)現(xiàn)在在js環(huán)境中運(yùn)行l(wèi)ua代碼的方案已經(jīng)很多了,這些方案大都分為兩類:
VM on VM:在js環(huán)境中移植或重新實(shí)現(xiàn)一個Lua VM。典型的代表是lua.vm.js和MoonShineJS。 這種方案的優(yōu)勢在于完整還原了整個標(biāo)準(zhǔn)lua,但主要缺陷在于,原本通過虛擬機(jī)執(zhí)行的Lua VM效率就不理想,再通過JS運(yùn)行,效率就更打一層折扣。
離線處理型:使用離線工具鏈將Lua語言翻譯成JS。如LLVM-Lua 加上javascript backend,還有一個名為lua2js的項目。這個方案的優(yōu)勢在于能做一些較為深入的優(yōu)化,缺點(diǎn)主要在于必須離線處理,不能直接在web上執(zhí)行,或者體積龐大,以至于本身加載都需要較長時間。除此以外,只能離線處理 導(dǎo)致了字符串執(zhí)行(如dostring等)的不可能實(shí)現(xiàn),還會影響Lua中的package結(jié)構(gòu)。
Lua.js采用一個不同的方案,它將lua代碼轉(zhuǎn)變?yōu)橐粋€AST樹,經(jīng)過一系列的轉(zhuǎn)換函數(shù),最后產(chǎn)出一個合乎js標(biāo)準(zhǔn)的AST樹,隨后生成一個合法的js代碼。因此轉(zhuǎn)換后直接執(zhí)行的代碼,比VM on VM要快2-5倍,高效的執(zhí)行速度有助于讓你的應(yīng)用或游戲展現(xiàn)流暢的極致體驗。
另外,壓縮后的Lua.js難以置信的小。這里是當(dāng)前l(fā)ua.js和lua.vm.js的對比:
|
文件大小 |
傳輸大小(gz壓縮) |
lua.js |
22.7K |
8.3K |
lua.vm.js |
638K |
203K |
盡管當(dāng)前l(fā)ua.js還有一些功能沒有實(shí)現(xiàn)(如metatable、Lua標(biāo)準(zhǔn)庫等),但可以預(yù)見全部實(shí)現(xiàn)后的尺寸也不會有大幅的增長,基本上不會超過30K/12K。
再談?wù)撔阅埽@里使用了lua.vm.js官方的幾個benchmark代碼(稍做修改使得可以在當(dāng)前版本的lua中運(yùn)行)(lua.js和lua.vm.js均在chrome下運(yùn)行),結(jié)果如下:
|
lua.js |
lua.vm.js |
lua 5.2.3 |
luaJIT 2.0.3 |
Scale |
What it measures |
Binary Trees |
8.526s |
10.198s |
4.006s |
0.731s |
seconds (lower numbers are better) |
GC Performance |
Scrimark |
26.98 |
8.84 |
30.52 |
1249.73 |
MFLOPS (higher numbers are better) |
numeric computation performance |
在當(dāng)前版本中,GC僅僅比lua.vm.js略快,這是因為現(xiàn)在lua.js對于table模擬還處于較為原型的階段,沒有經(jīng)過充足的優(yōu)化。但即使這樣也比lua.vm.js更快
而在數(shù)值計算上,性能遠(yuǎn)超lua.vm.js,逼近官方lua,這同樣是在lua.js還沒有經(jīng)過充足優(yōu)化的前提下。經(jīng)過優(yōu)化,完全有超過官方Lua的可能性。
如果你對lua.js感興趣,在這里可以下載獨(dú)立的js文件:
lua.js尚處于不完善狀態(tài),如果你決定嘗試使用,務(wù)必關(guān)注本項目的更新,及時替換更新的版本!