眼見為實,耳聽為虛,先上live demo:
http://luajs.org
其實現在在js環境中運行lua代碼的方案已經很多了,這些方案大都分為兩類:
VM on VM:在js環境中移植或重新實現一個Lua VM。典型的代表是lua.vm.js和MoonShineJS。 這種方案的優勢在于完整還原了整個標準lua,但主要缺陷在于,原本通過虛擬機執行的Lua VM效率就不理想,再通過JS運行,效率就更打一層折扣。
離線處理型:使用離線工具鏈將Lua語言翻譯成JS。如LLVM-Lua 加上javascript backend,還有一個名為lua2js的項目。這個方案的優勢在于能做一些較為深入的優化,缺點主要在于必須離線處理,不能直接在web上執行,或者體積龐大,以至于本身加載都需要較長時間。除此以外,只能離線處理 導致了字符串執行(如dostring等)的不可能實現,還會影響Lua中的package結構。
Lua.js采用一個不同的方案,它將lua代碼轉變為一個AST樹,經過一系列的轉換函數,最后產出一個合乎js標準的AST樹,隨后生成一個合法的js代碼。因此轉換后直接執行的代碼,比VM on VM要快2-5倍,高效的執行速度有助于讓你的應用或游戲展現流暢的極致體驗。
另外,壓縮后的Lua.js難以置信的小。這里是當前lua.js和lua.vm.js的對比:
|
文件大小 |
傳輸大小(gz壓縮) |
lua.js |
22.7K |
8.3K |
lua.vm.js |
638K |
203K |
盡管當前lua.js還有一些功能沒有實現(如metatable、Lua標準庫等),但可以預見全部實現后的尺寸也不會有大幅的增長,基本上不會超過30K/12K。
再談論性能,這里使用了lua.vm.js官方的幾個benchmark代碼(稍做修改使得可以在當前版本的lua中運行)(lua.js和lua.vm.js均在chrome下運行),結果如下:
|
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 |
在當前版本中,GC僅僅比lua.vm.js略快,這是因為現在lua.js對于table模擬還處于較為原型的階段,沒有經過充足的優化。但即使這樣也比lua.vm.js更快
而在數值計算上,性能遠超lua.vm.js,逼近官方lua,這同樣是在lua.js還沒有經過充足優化的前提下。經過優化,完全有超過官方Lua的可能性。
如果你對lua.js感興趣,在這里可以下載獨立的js文件:
lua.js尚處于不完善狀態,如果你決定嘗試使用,務必關注本項目的更新,及時替換更新的版本!