北极洲 2012-02-28
在这篇文章中,我将向你解释为什么要使用Lua。我写这篇文章最初的动机是由于Lua邮件列表中的一则消息 “why isn't Lua more widely used?” 。针对这个消息的回复各种各样,有的说是因为缺少类库,而我更赞同另外一个观点,那就是大部分人都不喜欢自己动手 (do it yourself)的方式来解决问题。我常常把Lua比作Arch Linux。这也就注定了Lua是一个小众产品。下面我将列出几条为什么我要使用Lua的理由:
1. 可以和 C/C++ 集成
我的编程经历不长,但是我已经使用过很多种语言了,包括Lisp,Scheme,Python,Perl,Bash,VBA,SQL等等。但是它们没有一个可以像Lua那样可以和C混着使用。C语言的API非常的干净和直观,你花一个下午的时间就可以上手了。如果你对这个感兴趣的话,你可以看看“PIL's section on the C API” 。
为什么这个特性很重要呢?首先,如果你有现成的C/C++类库的话,你可以很容易的在Lua中调用这些API。或者你也可以写一个脚本让Lua在C中执行。这也意味着Lua的程序不会有速度问题。如果你还是觉得Lua不够快的话,你可以用C完全重写这段代码。虽然别的语言的程序也可以用C重写,但是我还没有发现谁能比Lua更方便的做到这一点。
2. 快速、简洁
相比于其他语言,Lua的实现是非常高效的。也许是因为Lua使用的是“基于寄存器的虚拟机” 而不是基于堆栈的虚拟机。或者说使用Lua的开发者都非常的牛逼。不管怎样,你几乎不需要顾虑Lua代码的性能问题。
但是如果你对性能还是不满意的话,你可以尝试使用LuaJIT:
“LuaJIT是公认的运行最快的动态语言的实现,并且对内存的使用少,虚拟机占用低于125K,JIT编译器占用不到85K (在x86环境中)。”
LuaJIT可以几乎和C代码饿速度媲美。不管怎样,如果你还是对速度不满意的话,你可以试试我在第一点中提出的建议。
3. 教育作用
虽然这不是一个编程语言的功能,但是我发现使用Lua让我对计算机科学的整体了解有所提高。比如说,这篇文章是关于 Lua 5.0 的实现的,让我对虚拟机是如何实现的有了一个了解。阅读源代码让我大开眼界。我认为这一切都得益于Lua有条不紊的改进
4. 函数式编程
Lua提供了函数式编程的架构,让编程更加的有趣。例如 anonymous functions, higher order functions, lexical closures,proper tail calls等等。这些特性不是语言的一些语法糖,而是Lua从底层就整合了这些特性。比如说,Lua的每一个方法都是一个值(比如数字2,或者字符串“ktr”),也就意味着每一个方法都是匿名的。你只要给它取个名字,然后你就可以调用它了。你可以给print重新赋值:
print = math.sin
你可以利用这个功能创建沙箱。如果print是一个危险的操作,你可以替换成你自己的print方法或者从全局中删除这个方法。
5. 任何东西都是一张表
在Lua中,任何一个变量类型都是一张表,例如Array,Hash,“module”或者全局变量等等。也就是说你可以“require”一些模块(类似Python的import语句)并且把结果当错table来处理。在Python中,你可以 __import__('...') 一些模块,然后返回值的变量就可以通过类似 var(module) 的方式来访问。在Lua中,你可以通过 module[var] 的方式来访问模块中的变量。我这里提到Python是为了强调不同之处,说明Lua更容易使用。
这也让你学习Lua的语法更加快速。你不用担心list和dictionary、package有什么不同。
6. 一致性
不知你是否意识到,Lua是非常一致的语言。它的很多功能都是做的恰到好处。比如说,Lua没有“for”循环直到Lua 4.0,也就是Lua语言发布7年以后。这是因为while循环更为通用,而且语法更简洁。Lua的开发团队相对来说比较保守,他们不接受patch,所以Lua的进化比较缓慢,但是比较平稳。你知道所有的功能都是有规划的在进行,也就意味着你不能指望你所期待的功能可以被很快的实现。
7. 可移植性
关于这一点我不会讲很多细节,但是Lua基本上可以在任何环境中运行。Lua的代码是按照“Clean ANSI C”的标准编写的,所以如果你有一个C的运行环境,你就可以运行Lua。