Lua.js,一個(gè)Lua2JS編譯器,一個(gè)新的JS運(yùn)行環(huán)境下的Lua方案
眼見為實(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)一個(gè)Lua VM。典型的代表是lua.vm.js和MoonShineJS。 這種方案的優(yōu)勢(shì)在于完整還原了整個(gè)標(biāo)準(zhǔn)lua,但主要缺陷在于,原本通過虛擬機(jī)執(zhí)行的Lua VM效率就不理想,再通過JS運(yùn)行,效率就更打一層折扣。
離線處理型:使用離線工具鏈將Lua語言翻譯成JS。如LLVM-Lua 加上javascript backend,還有一個(gè)名為lua2js的項(xiàng)目。這個(gè)方案的優(yōu)勢(shì)在于能做一些較為深入的優(yōu)化,缺點(diǎn)主要在于必須離線處理,不能直接在web上執(zhí)行,或者體積龐大,以至于本身加載都需要較長時(shí)間。除此以外,只能離線處理 導(dǎo)致了字符串執(zhí)行(如dostring等)的不可能實(shí)現(xiàn),還會(huì)影響Lua中的package結(jié)構(gòu)。
Lua.js采用一個(gè)不同的方案,它將lua代碼轉(zhuǎn)變?yōu)橐粋€(gè)AST樹,經(jīng)過一系列的轉(zhuǎn)換函數(shù),最后產(chǎn)出一個(gè)合乎js標(biāo)準(zhǔn)的AST樹,隨后生成一個(gè)合法的js代碼。因此轉(zhuǎn)換后直接執(zhí)行的代碼,比VM on VM要快2-5倍,高效的執(zhí)行速度有助于讓你的應(yīng)用或游戲展現(xiàn)流暢的極致體驗(yàn)。
另外,壓縮后的Lua.js難以置信的小。這里是當(dāng)前l(fā)ua.js和lua.vm.js的對(duì)比:
| 文件大小 | 傳輸大小(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)后的尺寸也不會(huì)有大幅的增長,基本上不會(huì)超過30K/12K。
再談?wù)撔阅?,這里使用了lua.vm.js官方的幾個(gè)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略快,這是因?yàn)楝F(xiàn)在lua.js對(duì)于table模擬還處于較為原型的階段,沒有經(jīng)過充足的優(yōu)化。但即使這樣也比lua.vm.js更快
而在數(shù)值計(jì)算上,性能遠(yuǎn)超lua.vm.js,逼近官方lua,這同樣是在lua.js還沒有經(jīng)過充足優(yōu)化的前提下。經(jīng)過優(yōu)化,完全有超過官方Lua的可能性。
lua.js的benchmark可以在http://luajs.org上找到,lua.vm.js的benchmark在 http://kripken.github.io/lua.vm.js/lua.vm.js.html
如果你對(duì)lua.js感興趣,在這里可以下載獨(dú)立的js文件:
lua.js尚處于不完善狀態(tài),如果你決定嘗試使用,務(wù)必關(guān)注本項(xiàng)目的更新,及時(shí)替換更新的版本!
posted on 2014-11-05 20:17 天地之靈 閱讀(10140) 評(píng)論(2) 編輯 收藏 引用

