漫话Lua:在游戏中崛起之后 这个热门语言何去何从?
我其实是非常不想讨论编程语言的好坏的,一个是因为这本身无法定论,就好像非要争论到底是中文好还是英文好一样;另一个是一旦有人谈论程序语言,必然各种声音四起,导致没完没了的“战争”。把以前关于语言的争论打印出来,恐怕可以盖一座摩天大楼了。以下内容只是我个人观点,存在偏见和误解还请原谅,如果有不同观点,可以讨论,我保留态度。
既然要聊Lua,那么首先需要介绍一下它,Lua是一门设计优雅,轻量、易扩展的可嵌入式脚本语言。提起它,但凡使用过的朋友都会联想到这么几个关键词:轻量、快速、可嵌入等等。
一门语言想要流行,很大程度上并不取决于语言本身,而是由行业决定的。近年来Lua的流行,不得不承认,很大程度上是因为魔兽世界使用它所带来的影响,但是这也只是达成了大家使用它的前提,如果不是Lua自身的一些特点让大家觉得值得用它,Lua也不会有现在这么火爆。
我觉得Lua在游戏领域以及嵌入式设备上能够获得那么多人的支持,最主要的原因有3点:
首先是Lua足够的小。有人说小也能够成为用它的理由吗?在别的领域可能很难让人信服,但是在编写程序上,这绝对有说服力。Lua官网发布的版本,比如Lua5.1,实现的内容包括整个Lua的核心加上几个基本的库,整个实现也就只有2万多行代码,代码量如此的精简,让人不得不佩服Lua作者在追求语言的简练性上所做出的努力。Lua源码采用C语言实现,能够非常容易地嵌入到C\C++的程序中,因为Lua的小巧,你可以根据自己需要来调整Lua的源码,让它满足自己程序的要求,在阅读源码的时候,可以非常清楚得弄明白,语言的内部到底在做些什么,而不必去担心因为引入它而出现一些意想不到的bug。
第二个使用Lua的原因是它极佳的可移植性。因为Lua使用ANSI C编写而成,这使得它天生就具备极佳的可移植性,我们能够在各种设备的开发上使用它,比如目前最火的手机软件的开发,国内流行的手游开发模式cocos2dx + Lua也证明了这一点。相信在不久的将来,我们能够在更多的设备开发中发现Lua的身影。
另一个重要的原因我认为是Lua从5.0版本后使用了MIT协议进行发布,这使得几乎所有人都可以把它放进自己的产品中,而不用去担心版权的问题,至少对于商业软件来说,这一点属于必须考虑的问题之一。使用它会不会有法律纠纷,修改它有没有那么自由,这些也是一个有责任的程序员所必须面对的问题。
Lua语言受到这么多开发者的拥戴,在我看来也是十分正常的。一门程序语言能不能得到使用者的喜爱,最重要的一个标准就是能否拿它实现自己想要的目标。Lua的小巧,代码的精炼,使得它相对于其他庞大的脚本语言来说有着极大的优势,这门语言是否剔除了不必要的冗余结构,是否干净、整洁、KISS,这都是非常重要的,它内部实现的各个模块是否逻辑正交,是否已经达到最简。作为一名程序员,我当然希望我所使用的语言如同数学公理系统一样完美,满足相容、独立、完备的性质。当然,我不是说Lua达到了这样的标准,在我使用过的所有语言当中,我也找不到满足这样标准的语言,但是Lua精简的源码,却是让人眼前一亮。
不得不说目前Lua用的最火的地方,还是在游戏开发上(当然,像Adobe Photoshop Lightroom这样大量使用Lua的软件也不在少数)。我们看到除了《魔兽世界》、《孤岛危机》这样的PC端大作使用它以外,像《愤怒的小鸟》以及网上流行的开源版本的《Flappy Bird》也使用Lua作为脚本来处理从逻辑到UI的各种工作。在我自己的项目当中,也大量的使用到了Lua,无论是作为服务端的逻辑,还是客户端的UI处理,Lua的优势都显而易见,它的各种语言特性让人处处惊喜。Lua的语法虽然谈不上极为简洁,但是写起来是十分舒服的,而且让看代码的人也不会很痛苦,心理负担相对较小;Lua中最重要的数据类型table类型,也让人在使用的时候有一种发现宝藏的感觉,table的实现方式采用数组和散列表的组合,无论是查询效率还是插入效率,都让人满意,至少在处理一般逻辑问题上,table的描述能力和性能是十分强大的;作为一门动态类型语言,Lua的gc处理以及弱引用机制也让人印象深刻;在面向对象方面,Lua自身所具备的机制(比如元表)提供了实现面向对象编程的多种途径;还有Lua的协程机制,对于编写并行逻辑是非常有用的,它让我们可以用同步的方式写出异步回调的逻辑,减少学习的时间,降低使用的成本。Lua的性能也是它的一大亮点,基于寄存器的虚拟机本来是Lua作者的一次尝试,但是结果证明,这是成功的。Lua还有各种各样的特点,比如优秀的C API等等,所以我觉得,在未来,Lua将会继续在各个设备和领域得到广泛的运用。
因为最近Lua的火爆,有人拿它和Javascript做对比,既然编辑也问到这个问题,我也说一下我的看法,Javascript的火爆是有目共睹的,在github上,js的代码项目无疑是最多,自从存在Web应用以来,js就一直被人们所关注,并在不断的发展壮大当中,现在越来越多的非Web应用也采用了js来编写,它无疑是一种被大家认可且喜爱的语言,它已经被证明拥有构建大规模复杂程序的能力。它和Lua有许多相似之处,也有大量的不同,这源于js的设计目的本来就和Lua是有所差异的,Lua的作者也曾说过,Lua并非是为了设计成为主流的编程语言,但在嵌入C\C++程序,或者是作为API的封装以及作为宿主程序和逻辑层之间的粘合剂,Lua有着天然的优势。到底是使用js还是选择Lua则要根据它们自身的特点以及自己所面对的应用场景来定。
前面谈的,其实在各种资料和业内新闻以及博客中都能够看到,为了表示我没有敷衍了事,下面说点我对Lua未来的想法。
Lua目前被大家广泛使用,有一部分原因是因为它强大的性能,我们可以在网上看到各种语言和Lua比速度、比性能的报告,但是在未来,随着计算机运算速度的提升,我相信我们考虑性能问题会越来越弱化,这并不是说性能问题不重要,在任何时候,追求性能的卓越都是值得鼓励的,而且在某些方面,性能是越快越好,比如一些数值运算或者是图形的渲染处理等等。但是作为程序员,更多的去关注程序的逻辑,把性能问题交给编译器才是我理想中的情况。在这种弱化性能问题的情况下,Lua能否继续被广泛使用呢?这是我的第一个考虑。
其次,在未来,我相信大多数语言的核心都会被设计的精简、强壮,而各种各样的库才是我们大家关注的焦点,当程序库成为比语言核心更为重要的东西的时候,一个很明显的例子就是python语言,python有着各种各样丰富多彩的程序库,我身边的朋友使用python的时候,从来就不操心有功能没办法实现,因为已经有大量可用的程序库可以选择,而相比下来,Lua的程序库就要少了许多,Lua的能力更多的是依靠它的宿主语言赋予的,那么将来Lua能否拥有一些可供选择,不需要重新造轮子,完善的程序库供我们使用呢?这是我的第二个考虑。
第三个考虑是,在Lua广泛使用之前,使用者的人数比较少,Lua的作者可以对语言进行大刀阔斧的修改,而不会引起大规模的恐慌或不满,每个用户都可以向作者提出自己的意见和方案,就好像拍美剧一样,每一集都由不同的编剧来写,但是最终由总编剧来把握整个剧情的发展,Lua的一切修改,最终都由Lua的作者来决定并实现,用户数少的时候这没有问题,但是当用户数量增多之后,这种发布方式能否跟得上现代开源软件的发展趋势呢?比如Lua5.2和LuaJIT的分裂就让我们痛心疾首,而Lua各个版本之间的不兼容也让我们寝食难安,我怀着良好的心态相信这最终会得到解决。