Lua是一门怎样的语言

前言

曾经面试时被面试官问过这样的一个问题:“你觉得Lua是一门怎样的语言”,因为问题问得太泛,我当时一下子懵逼了不知道从哪说起。

Lua起源

Lua 是巴西里约热内卢天主教大学(Pontifical Catholic University of Rio de Janeiro)里的一个研究小组于 1993 年开发的,该小组成员有:Roberto Ierusalimschy、Waldemar Celes 和 Luiz Henrique de Figueiredo。

设计目的

Lua 是一种轻量小巧的脚本语言,用标准C语言编写并以源代码形式开放, 其设计目的是为了嵌入应用程序中,从而为应用程序提供灵活的扩展和定制功能。

特性

轻量级

它用标准C语言编写并以源代码形式开放,编译后仅仅一百余K,可以很方便的嵌入别的程序里。

可扩展

Lua提供了非常易于使用的扩展接口和机制:由宿主语言(通常是C或C++)提供这些功能,Lua可以使用它们,就像是本来就内置的功能一样。

其他特性

  • 支持面向过程(procedure-oriented)编程和函数式编程(functional programming)。
  • 自动内存管理;只提供了一种通用类型的表(table),用它可以实现数组,哈希表,集合,对象。
  • 语言内置模式匹配;闭包(closure);函数也可以看做一个值;提供多线程(协同进程,并非操作系统所支持的线程)支持。
  • 通过闭包和table可以很方便地支持面向对象编程所需要的一些关键机制,比如数据抽象,虚函数,继承和重载等。

Lua在游戏开发中应用普遍

放眼整个IT行业,Lua可能并不算什么热门语言,但在游戏行业的同学应该都比较熟悉这门语言,特别是目前移动端游戏占主要市场的情况下,Lua作为热更脚本语言已成主流,且已经有多个成熟的Lua热更方案,以及无数产品案例。

移动端热更刚需

游戏更新非常频繁,鉴于在移动平台直接整包更新的综合成本过大,在IOS还需要通过AppStore的审核,使用脚本语言编写游戏逻辑以实现游戏热更新是当前游戏开发中使用Lua的核心原因。

魔兽世界选择了Lua

Lua实际上并不是应移动端游戏热更需求才应用在游戏开发中的,早在端游时期,魔兽世界就开始使用Lua作为脚本语言,后来到国内的网易、西山居等都使用了Lua。作为行业头部的公司,他们产品在技术选型时选了Lua,无疑起了很好的带头作用,其他公司在有脚本语言需求时,跟随其步伐也是很正常的,毕竟已经有前人开荒过。

Lua自身优势

  • Lua语法十分简单,可以快速上手,甚至一些的策划同学,都可以通过lua脚本编写简单的逻辑,搭建功能原型。
  • 嵌入宿主语言非常简单。
  • 轻量、占用非常小,同时仍然保持不错的运行效率
  • 可移植性强

Lua与C#对比

认识一门语言,从一门自己熟悉的语言来对比这门语言,是一个很好的角度。

  • C#需要编译成IL语言再发布,运行时再由JIT编译成机器码,Lua通过解释字符串,最后由用c语言写的虚拟机去执行这些字符串编译出来的字节码。也就是C#必须在运行前编译一次,而Lua则在运行时才编译,凭借这一点Lua可以轻松实现运行时代码热重载,可以保持程序运行下修改代码逻辑,而C#一般都得重启程序,等待编译。
  • C#是静态、强类型语言,Lua是动态、弱类型语言。C#在编写时具备类型安全,类型不匹配会被明确提示,而Lua则只能在运行时才能发现,但这也为Lua带来了巨大的灵活性,在编写简单的业务逻辑时能加快开发速度(这一点存在争议,笔者个人经验确实是写Lua会快点),与之相对的是,这也给阅读Lua代码、重构是造成很大的困难。(所谓懂的都懂,不懂的说了也没用,梭哈一时爽,重构火葬场)
  • C#有丰富的类库提供各种各样的数据结构,而Lua只有唯一的数据结构——Table,内部由散列表和数组结合实现,Lua这样的好处是保证了体积的大小,保证了自身的轻量,坏处就是面向复杂需求时会比较乏力,需要自己造轮子,当然脚本本身也只是为了写简单业务而已。