Javscript or Lua, this is a question…
从去年10月份开始用Lua做东西,期间颇多折腾,但是也略有小成,习惯了用”{…}”和“;”来的代码风格,乍一用Lua,还真有点不适应。最近开始折腾Node.js,逐渐对V8产生好感,同样是脚本语言,Javascript的语法比起Lua来,天生让我有种更靠谱的错觉…于是我面临一个严肃的选择,是继续使用Lua,还是华丽转身投向V8。
Lua与V8比起来,相似之处在于:
- weak type
- 垃圾回收
- 单线程,GC位于主线程,因此在高吞吐量的对象操作时,执行效率会急剧下降(云风提出过将Lua中的GC移到另一线程的方案)
- 都有部分函数式编程的特性,支持closure
- 面向对象的实现方法非常类似,Lua中是metatable,而javascript中是prototype
- Lua与V8都是非常高效的实现(http://shootout.alioth./)
- 都有很好的API和扩展支持
而它们的差异之处在于:
项目 |
Lua |
Javascript |
错误处理 |
callback函数 |
很fancy的try…catch…异常处理机制 |
Weak references |
yes |
no |
coroutine协程 |
yes |
no |
JIT |
LuaJIT |
V8, TraceMonkey |
Encoding |
需要通过hack手段支持UTF-8 |
V8原生支持 |
数组 |
不能包含nil元素,因为nil意味着数组结尾 |
可以包含null元素 |
循环中的“continue”支持 |
no(需要hack来支持) |
yes |
footprint |
极其轻量(50k) |
v8-shell将近10MB |
社区 |
主要是游戏开发者社区 |
主要是前端开发者社区 |
实现语言 |
c |
c++ |
标准库 |
yes |
no |
.NET CLR实现 |
主要是一些p/invoke的wrapper |
ironJS |
java实现 |
mochalua和kahlua都已经不活跃了 |
Rhino |
调试器支持 |
弱,基本只能通过log trace方式来 |
d8,可用eclipse断点跟踪 |
从跨语言开发和社区支持的角度来看,Javascript有更大的优势,然而Lua在执行性能(JIT)和语言特性上则有独一无二的优点。Lua天生就是作为一个极其轻量、可嵌入的设计实现,它更适合做API的封装或是数据传输的中间层,假如需要跨设备边界,并在不同语言环境中进行移植,Javascript是个更好的选择,而且Javascript似乎已经证明了具有构建大规模复杂程序的能力。