2012-04-21 84 views
4

Lua很小,可以很容易地嵌入。目前的JavaScript虛擬機非常龐大,很難集成到現有的應用程序中。
所以不可能將JavaScript編譯爲Lua或Lua字節碼?
特別是對於移動應用中的限制,這看起來很合適。能夠輕鬆地將最流行的腳本語言集成到任何iPhone或Android應用程序中會很好。在Lua虛擬機上運行JavaScript有意義嗎?

我對Lua不是很熟悉,所以我不知道這在技術上是否可行。
Luvit有一個活動項目試圖將Node.js體系結構移植到Lua。所以這個平靜的JavaScript世界離Lua中的可能還有很遠的距離。

+0

當然,V8可以(也是通過Node.js)用作C庫。 – Pointy 2012-04-21 14:43:33

+0

我更新了我的問題 - 你是對的V8可以用作圖書館。但由於其複雜性,它不是開發人員爲單個應用程序項目所做的事情。 iOS上的本地代碼生成也有限制。 嵌入Lua在遊戲中更容易和相當普遍。 – mirkokiefer 2012-04-21 16:03:11

+0

只是關於Node.js的一條評論 - 'luvit'不是唯一的,也不是第一個將Node.js移植到Lua的項目,還有[LuaNode](https://github.com/ignacio/LuaNode)。它使用'boost.asio'而不是'libuv'。 – 2012-04-21 16:31:08

回答

5

將Javascript編譯爲Lua的勝利並不像你想象的那麼好。 Javascript的語義與Lua的語義非常不同(LuaJIT的作者引用Lua的設計是LuaJIT可以與Javascript JIT編譯器競爭的主要原因之一)。

把這個代碼:

if("1" == 1) 
{ 
    print("Yes"); 
} 

這版畫 「是」 在Javascript。 Lua中的等效代碼不會,因爲字符串永遠不會等於Lua中的數字。這可能看起來很小,但它有一個根本性結果:我們不能再使用Lua的內置平等測試。

我們可以採取兩種解決方案。我們可以將1 == "1"重寫爲javascript_equals(1, "1")。或者我們可以將每個Javascript值包含在Lua中,並使用Lua的元表達式來覆蓋==運算符行爲。

因此,我們已經通過將JavaScript映射到Lua而失去了一些效率。這是一個簡單的例子,但它一直持續下去。例如,Javascript和Lua之間的所有運算符規則都不相同。

我們甚至不得不打包Javascript對象,因爲它們與Lua表不同。例如JavaScript對象只支持字符串鍵,並且強迫任何索引的字符串:

> a = {} 
{} 
> a[1] = "Hello" 
'Hello' 
> a["1"] 
'Hello' 

你還必須要提防JavaScript的作用域規則,可變參數的功能,等等。

現在,如果有人將努力放到完整的編譯器中,所有這些東西都是可以克服的。然而,任何效率收益很快就會被淹沒。你基本上最終會在Lua中構建一個Javascript解釋器。大多數Javascript解釋器都是用C編寫的,並且已經針對Javascript的語義進行了優化。

因此,這樣做是爲了提高效率是一個失敗的原因。可能還有其他一些原因 - 比如在Lua環境中支持Javascript,儘管如果可能的話,只要將Lua綁定到現有的Javascript解釋器中,可能會少一些工作。

如果你想用Javascript-> Lua源代碼到源代碼翻譯器玩,請看看js2lua,這是我在一段時間後創建的一個玩具項目。它並不是完整的,但玩它肯定會給人一些思考的食物。它已經包含一個Javascript詞法分析器,所以已經完成了艱苦的工作。