換掉Lua是個錯誤

要支持一種腳本語言,JavaScript無疑是非常好的選擇。最大的優勢就是上過網的人大多知道JavaScript是什麼,很多人都能寫上那麼一兩行。儘管JavaScript也有一些WTF(Worse Than Failure)的地方,但不影響它成爲一個非常成功個的動態腳本語言。

在發現Jint開源項目後,我想終於有個.NET上能用的JavaScript引擎了。不要提JScript.NET,那個已經在微軟的淘汰進程中了,而且它不是真正的JavaScript,不是動態的。我想,我終於可以從Lua的一堆問題中解脫了。

Lua的主要問題是,它的語法太詭異了,以致我寫腳本時會不斷的寫出語法錯誤。它的不等於是~=(怎麼看怎麼像約等於),調用方法時的分隔符爲:而不是點,else if是elseif…… 也許沒學過編程的人不會犯我這些錯誤。但問題的關鍵是,它的基本語法和所有主流語言都非常不同,不管你以前學過什麼語言,你都得花時間學這門新語言,儘管它很簡單。別忘了還有標準函數庫。

其次的問題就是它不支持Unicode字符串,這個不止導致和腳本間傳遞字符串時必須做相對費時的編碼轉換,而且腳本里會缺少能對非英語字符串正確操作的例程。

於是我移植到了Jint上,結果發現了Jint的不少bug。我想,沒關係,它還在beta階段。於是我花時間debug,給Jint打了數個補丁,總算能用了。但是,它編譯時的語法檢查所報的錯誤信息非常的糟糕,很多情況下不能給出到底什麼錯了,給出了也可能是個謎語。我想,沒關係,它還在beta階段。我把bug和patch報給他們的網站,然後繼續其他部分的開發。

五個月過去了,Jint還沒有新版本出來,不但如此,還有種人去樓空的感覺。開源項目的問題之一就是這個,沒準哪一天,開發者就不知道消失到哪裏去了。如果是已經成熟的項目還好,最怕這種半截就沒下文的,別人接手都很難。

而且,在我開始做壓力測試時,腳本的開銷開始顯現出來,它太慢了。我曾想,反正是腳本,速度差幾倍也沒關係。但是,當實體數量較大時,這個總時間還是非常可觀的,以致我不得不回到性能優先的思路。這時Lua的輕量級、高性能的特質完全形成壓倒性的優勢。

JavaScript的問題並不是語言不好,而是缺少一個高質量的、適合遊戲嵌入的實現。而且要實現它還真不容易,不但要實現煩瑣的ECMAScript規範,還有這麼多年積累下來的爲web的兼容性而產生的各種怪癖。Google的V8似乎是個不錯的實現,但它是針對web優化的,以內存換速度。而Lua幾乎就是完全爲遊戲設計的,極簡、極小、極快。這也促成了Lua在整個遊戲行業的重要性,WoW、FarCry等都用了Lua。沒辦法,想要它的優點就必須同時接受它的缺點。由於Lua的流行程度,有衆多Lua相關的開源項目存在,一個死了還有其它替代品,而且不斷有新的項目出現,推動它跟上技術發展的潮流。即使這些資源都消失,也沒關係,Lua很簡單,自己來維護一下也不是不可能。

 

附:一些JavaScript的WTF的例子,並不是說它不好,只是很有趣。如今作爲web的基礎之一,這些歷史積累問題也只能如此了。

 

"5" + 3 結果是 "53"

"5" - 3 結果是 2

 

JavaScript世界的真理列表:

''        ==   '0'           //false
0 == '' //true
0 == '0' //true
false == 'false' //false
false == '0' //true
false == undefined //false
false == null //false
null == undefined //true
" /t/r/n" == 0 //true

發佈了118 篇原創文章 · 獲贊 137 · 訪問量 50萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章