要支持一种脚本语言,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