【在主画面加入捷径】
       
【选择语系】
繁中 简中

[Lua] 程序设计教学:分裂的 Lua 世界

【赞助商连结】

    Lua 不是一个主流的语言,不过还蛮常见的,主要用于游戏引擎 (game engines) 和其他软件的脚本语言 (scripting language)。本文的目的在说明 Lua 的特性及这些特性对 Lua 社群的影响。

    Lua 最重要的概念在于 Lua 是一种内嵌语言 (embedded language),而和一些大而全的通用型脚本语言,如 Python 或 Ruby 等,不同。对于 Python 或 Ruby 等主流语言来说,会有一个主要的实现品 (implementation) 加上标准函式库 (standard library),不足的再由第三方套件 (third-party packages) 加强其功能。但 Lua 是包在其他宿主软件 (host software) 内,由宿主软件来提供功能;像是 Corona 和 Cocos2d-x 这两套游戏引擎都使用 Lua,但两者的 API 却不互通。此外,Lua 的套件不仅相对少,而且不同宿主软件间的套件无法通用,通常都是由各位宿主软件各自提供插件 (plugin) 来扩充其功能。因此,Lua 社群是分裂的。

    为什么会使用 Lua 这种内嵌语言出现呢?假设我们现在在开发一个电脑游戏,如果我们将所有的游戏参数都写死在 C++ 程序代码中,当我们要更动某些游戏参数时,必需要重新编译我们的程序;中大型的 C++ 程序,每次编译都要耗费不短的时间,无形中造成开发效率的低落。如果我们将一些游戏参数等非效能瓶颈的部分抽离出来,写在 Lua 脚本中;当我们要修改参数时,只要更动相关的 Lua 脚本即可,无形中减少不少编译软件的时间,也更利于分工。

    除了内嵌的特性以外,Lua 版本的差异也造成 Lua 社群更加分裂。Lua 在 5.1 版至 5.2 版之间进行了一些不兼容的更动,不仅在于 Lua 的语法本身,也在于其 C API,如果想要软件内嵌的 Lua 升级,势必要更改一部分内容。另外,Lua 除了官方的版本外,还有一个非官方的 LuaJIT,而 LuaJIT 的 Lua 版本约略在 5.1 至 5.2 版之间。有趣的是,LuaJIT 的效能还比官方的 Lua 版本佳,差距可达到 5 至 50 倍之间。虽然官方的 Lua 版本已经来到 5.3 版,但很多软件仍然停留在 5.1 版或是 LuaJIT 版,这是在大部分主流语言少见的现象。

    对于 Lua 学习者来说,要如何因应呢?追随 Lua 版本的变动不是最重要的,选择自己所需的宿主软件,使用该宿主软件所对应的 Lua 版本即可。以撰写游戏软件来例,在开始撰写游戏前,先将该引擎提供的 API 大略浏览一次,并阅读其插件手册,了解相关的功能是否符合自己的需求,再开始撰写游戏,像是 Corona SDK 适合 2D 或 2.5 D 游戏,但对于 3D 游戏就无能为力;由于各个宿主软件的 API 不兼容,换宿主软件等于一大部分的程序代码要重写,所以,一开始时就要选好适合自己的游戏引擎。

    如果只是想先学一下 Lua 的语法,那么,选择 5.1 版或是 LuaJIT 是较佳的选择。新版 Lua 所带来的新语法特性,相对来说不是那么重要;而且,许多软件其实没有将其内嵌的 Lua 版本更新,或是使用 LuaJIT。所以,即使 Lua 5.1 版有点旧了,笔者仍然推荐从这个版本开始学习 Lua。

    对于想要将 Lua 内嵌于自己软件的开发者来说,要使用那个版本呢?理论上,任何一个版本皆可;如果很在意效能的话,使用 LuaJIT 是比较好的选择;如果使用官方版 Lua,就没有必要守在 5.1 版了,大可使用最新的 5.3 版。

    经过本文的介绍,相信读者已经对 Lua 有一些基本的概念。笔者在本系列文章,以 Lua 语法本身为主,对于特定的 Lua 相关软件,如 Corona 或 Cocos2d-x,则不在范围中;我们另外在这里介绍 Corona,有兴趣的读者,可以前往该页面。另外,如果读者比较喜欢读实例书籍,可参考 Programming in Lua。在下一篇文章中,我们会建置 Lua 开发环境,为撰写 Lua 程序作准备。