Lua

义项:轻量级脚本编程语言
Lua

Lua是一种轻量、可嵌入的脚本编程语言,由巴西里约热内卢天主教大学计算机图形技术组(Tecgraf)的3位研究者于1993年设计完成[1]。它以表(table)作为唯一的内建复合数据结构,并以简洁的C语言应用编程接口嵌入宿主程序,适用于配置、脚本编写和快速原型开发。其官方解释器用ANSI C编写、体积小、可跨平台编译,因而在游戏开发与嵌入式系统中应用广泛[2]。

目录
  1. 定义
  2. 原理
  3. 发展历程
  4. 应用
  5. 局限
  6. 参见

定义

Lua是一门动态类型的脚本语言,设计目标是被嵌入到其他应用程序中运行,而不是作为独立的开发语言使用。它把过程式语法与基于关联数组的数据描述能力结合起来,同时支持过程式、面向对象、函数式和数据驱动等多种编程风格。Lua的名称来自葡萄牙语中的“月亮”,取自其前身语言Sol(意为“太阳”)的对应称呼[3]。

Lua的语言规范由参考手册形式发布,官方实现以ANSI C写成,源代码总量约3万行;5.4.6版的源码与文档压缩包约355KB。它仅内置少量原子数据类型,数组、集合、列表、记录等结构均由表这一种类型模拟[4]。

原理

Lua程序并不直接按文本逐行执行,而是先编译为字节码,再由虚拟机运行;这一编译过程对使用者通常不可见,也可以在宿主环境中预先完成,以缩短加载时间或省去编译器[5]。Lua 5的虚拟机采用寄存器架构,与多数基于栈的虚拟机不同,这种设计减少了值的复制和每条函数所需的指令数量[5]。

语言的核心数据结构是表,它是由键值对构成的异质关联数组,键不能为nil与NaN,数字键1与字符串键"1"被视为不同的键[5]。每个值都可以带有一张元表,元表中以双下划线开头的字段(如__add)规定了该值在算术运算、比较、拼接、索引等操作下的行为,这一机制被称为元方法[6]。类与继承并不属于语言的内建概念,而是通过表与元方法组合模拟出来[5]。

内存由增量式标记清扫垃圾收集器自动管理,收集器通过“暂停”和“步进倍率”两个百分比参数控制回收节奏[6]。语言还提供一等函数、闭包、正规尾调用、运行期字符串与数值的自动转换、协程以及动态模块加载等特性[4]。嵌入宿主程序时,Lua通过一套基于栈的C语言应用编程接口交换数据,宿主既可以调用脚本中的函数,也可以注册C函数供脚本使用。

发展历程

Lua诞生于1993年,其直接来源是巴西石油公司(Petrobras)的两个内部项目所使用的数据录入语言DEL和可配置报表语言SOL,这两种语言缺少控制结构,促使研究者设计一门具备完整编程能力的语言[1]。由于当时巴西对计算机软硬件实行市场保护政策,客户难以从国外采购定制软件,为Tecgraf开发工具成为现实选择[1]。语言的需求中包括可移植性,因为巴西石油公司的机器种类繁多,涵盖PC DOS、Windows、Macintosh与各类Unix系统[1]。

早期Lua的语法借鉴了Modula的控制结构、C++的局部变量声明、CLU的多重赋值与多重返回,而把表作为主要数据结构则受到LISP与Scheme的影响。在5.0版之前,Lua使用自有的、接近BSD的许可证,之后改用MIT许可证发布[7]。2007年,Lua的设计者向第三届ACM编程语言史会议提交了介绍其演进过程的论文。

2011年,该语言获得游戏开发者杂志颁发的Front Line Award奖项。Lua 5.5.0于2025年12月22日发布,距上一主要版本5.4约5年,新增了全局变量的显式声明、命名可变参数表,并把主要垃圾收集改为增量执行,大型数组的内存占用约减少60%[8][9]。同版本中for循环的控制变量被改为只读[9]。

应用

Lua最常见的用途是作为宿主程序的嵌入式脚本层,由此实现可配置性与可扩展性[2]。官方资料列举的工业案例包括Adobe的Photoshop Lightroom、巴西数字电视中间件Ginga,以及《魔兽世界》等游戏。在游戏领域,它被描述为主要使用的脚本语言。

除C与C++外,Lua也被用于扩展以Java、C#、Smalltalk、Fortran、Ada、Erlang乃至Perl、Ruby编写的程序。它可以运行在各类Unix与Windows系统、运行Android与iOS的移动设备、ARM等嵌入式处理器以及IBM大型机上。游戏之外,它还被用于数据库插件、入侵检测系统等场景[10]。

作为独立实现,LuaJIT以即时编译方式执行Lua代码,用于需要更高运行速度的场合。

局限

Lua的官方版本只包含精简的核心与最基本的库,网络通信、图形界面等能力并不预置,需要由宿主语言或外部扩展模块提供[2]。因此其标准库函数较少,生态规模不及Python等通用语言,通常不作为开发独立应用程序的首选[11]。

该语言是动态类型语言,类型错误往往在运行期才暴露,代码规模增大时组织与维护的难度随之上升[12]。语言层面的并发支持仅为协作式协程,标准实现不提供抢占式多线程与多核并行能力[11]。

版本之间的兼容性较弱,从5.1升级到5.2等跨越式升级需要较多改动;5.5版引入global关键字后,旧版二进制代码块与新版本亦不兼容[11][13]。C语言应用编程接口基于栈且细节繁琐,被认为是使用门槛较高的部分[11]。

参见

  • LuaJIT —— 采用即时编译的Lua独立实现,用于改善运行速度

  • Python —— 同为动态类型的脚本语言,常被拿来与Lua比较库生态

  • 元表 —— Lua实现运算符重载与对象模拟的核心机制

  • 协程 —— Lua提供的协作式并发编程设施

  • MIT许可证 —— Lua 5.0起采用的宽松开源许可协议

参考资料

  1. JavaScript disabled - The Evolution of Lua [引用日期2026-10-29]
  2. 維基百科 [引用日期2026-10-29]
  3. The Evolution of an Extension Language: A History of Lua [引用日期2026-10-29]
  4. Lua (programming language) [引用日期2026-10-29]
  5. Lua (programming language) [引用日期2026-10-29]
  6. Lua 5.3 Reference Manual [引用日期2026-10-29]
  7. Lua Programming [引用日期2026-10-29]
  8. Version history [引用日期2026-10-29]
  9. 軽量スクリプト言語「Lua 5.5」リリース [引用日期2026-10-29]
  10. 概述 [引用日期2026-10-29]
  11. 了解一下Lua,没准用得上 [引用日期2026-10-29]
  12. From lua-l Thu Mar 15 02:51:19 2018 [引用日期2026-10-29]
  13. securitylab.ru 上的网页 [引用日期2026-10-29]
词条评价
词条统计

浏览次数:2 次

阅读量:0 次 · 阅读完成量:0 次

最近更新:2026-10-28T18:53:17Z

历史版本

本条目引用的词条
参考手册 表 Tecgraf 魔兽世界 LuaJIT Python 元表 协程 MIT许可证