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