Lua: 中文导览
  • 何为
  • 来路
  • 语言
  • 为何
  • 谁用
  • 嵌入
  • 对比
  • 前景
// 1993 — 2026 · PUC-Rio · Roberto Ierusalimschy · "moon" in Portuguese

Lua:200KB

1993 年生于巴西 PUC-Rio, 设计目标朴素到挑衅: 整个语言塞进 200KB, 只用 C89, 零外部依赖。33 年后 Lua 住在每个游戏引擎、每个数据库、每个编辑器里——它不抢风头, 它住在所有东西里面。

1993PUC-Rio · 巴西
软件进口禁令的副产物
200KB核心解释器尺寸
Python 嵌入式 ~50×
8 types全部值类型 · 就这 8 个
nil / bool / num / str / fn / userdata / thread / table
70M DAURoblox Luau 日活
Lua 最大活跃方言
local t = {}metatablecoroutine.yieldrequire "foo"__indexlua_State *LLuaJIT 2.15.1 foreversetmetatablefunction() endredis.callnvim init.lua
scroll
01

何为 Lua

Lua 是 1993 年 PUC-Rio 三人组造的嵌入式脚本语言: Roberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celes。设计目标三句话讲完——"小、嵌得进 C、跑得动"。语言本身是一本 ~250 页书能讲完的工具; 它的厉害不在语言, 在它住在多少程序里。

语言即库 philosophy

Lua 是个 .a 静态库, 你的 C 程序 link 进去就能跑脚本。不是"Lua 调你"; 是"你嵌 Lua"。这条 1993 年的设计哲学决定了它 30 年的命运。

动态类型 · 8 种值 types

动态类型, 值类型仅 8 种: nil / boolean / number / string / function / userdata / thread / table。table 一个顶七个——数组、字典、对象、namespace、module 全是它。

GC + 协程 runtime

增量 GC (5.4 起分代式), 1993 年就有的协程 (yield / resume)。无 OS 线程开销的并发原语——OpenResty 整个并发模型站在这上面。

ANSI C89 编译 portable

整个解释器 ~30 个 .c 文件, 严格 ANSI C89, 不依赖 POSIX。能跑 C 的地方就能跑 Lua——这是它能进 PS3 / 路由器 / ESP32 的基础。

embed.pyCPython embed
// C side
// link libpython3 (~30 MB)
// + libffi · + libssl · + libz · ...

Py_Initialize();
PyRun_SimpleString("print('hi')");
Py_Finalize();

// runtime: ~10-30 MB resident
// startup: hundreds of ms
// 不适合塞进游戏 frame · 路由器 · MCU
embed.cLua embed
// C side · 5 行就完事
// link liblua (~200 KB)
// 0 外部依赖

lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_dostring(L, "print('hi')");
lua_close(L);

// runtime: ~200 KB resident
// startup: microseconds
// WoW client · Redis · Nginx · ESP32 都靠这套
02

来路 : Timeline

33 年, 从巴西大学一间小实验室到 70M Roblox 日活——Lua 没有"明星时刻", 它是慢工出细活的样本。每一年都安静往前走一步, 然后某天发现它已经住在你每天用的所有东西里。

  1. 1993·07

    诞生于 PUC-Rio

    巴西里约热内卢的天主教大学 (PUC-Rio), Roberto Ierusalimschy、Luiz Henrique de Figueiredo、Waldemar Celes 三人组在 Tecgraf 实验室造出 Lua 1.0。背景: 80 年代巴西禁止进口商业软件, 高校自己写工具——Lua 是这条限制的副产品。moon in Portuguese。

  2. 1995

    Lua 2.0 — 设计哲学定型

    "language as a library" 这条核心定下来: Lua 不试图统治你的程序, 它是你 C 程序里的一个 .a 文件。配置文件、脚本钩子、内嵌求值——这些用例从此长在 Lua 的基因里。

  3. 1996·12

    Dr. Dobb's 文章 — 走出巴西

    Ierusalimschy 等人在 Dr. Dobb's Journal 发文介绍 Lua, 英语圈第一次知道这门小语言。游戏开发者很快读到——这是 LucasArts / Bioware 等把 Lua 嵌进引擎的种子时刻。

  4. 2003

    Lua 5.0 — 现代 Lua 的起点

    引入词法作用域 closure、coroutine、真函数式 metatable。这一版之后语言"成形"了——之后 20 年的核心几乎不动, 改的是边角。许多老的 Lua 教材其实在描述 5.0。

  5. 2004·11

    World of Warcraft 上线 — Lua 进千万人客户端

    Blizzard 把 Lua 嵌进 WoW 客户端, 整个 UI + addon 系统用 Lua 写。WoW addon 一夜让 Lua 成为世界上间接用户最多的脚本语言之一: 几千万玩家 + 几万开发者。

  6. 2005·05

    LuaJIT 上线 — Mike Pall 一人作品

    奥地利程序员 Mike Pall 发布 LuaJIT 1.0: 给 Lua 加 trace-based JIT, 性能跨数量级提升。后续 LuaJIT 2 在数值循环上能跑赢 V8 / JVM——这在脚本语言里是异常稀有的。Lua 5.1 兼容这条线由此锁死。

  7. 2006

    Lua 5.1 — 长期之锚

    5.1 看起来只是版本号 +0.1, 实际成了 Lua 史上影响最大的一个版本。LuaJIT 永远 5.1 兼容; OpenResty / Redis / 游戏引擎 / Roblox Luau 都钉在 5.1 ABI 上。5.1 不是"老版本", 是事实标准。

  8. 2008

    Adobe Lightroom — Lua 写桌面 app

    Adobe 公开 Lightroom 的 UI 层大部分是 Lua 写的 (Lightroom SDK 也是 Lua)。这是"Lua 不只是游戏脚本"最有力的早期证据——专业桌面软件能整面 ship。

  9. 2011

    Lua 5.2 — 分叉的起点

    5.2 改 setfenv、加 goto、改 __pairs。社区分裂: LuaJIT 留 5.1, 主线走 5.2。从这刻起 "Lua 5.x" 不再是一个单一标签——选哪条线决定你的库生态。

  10. 2011·11

    OpenResty 1.0 — agentzh 把 Nginx 变成 Lua 平台

    章亦春 (agentzh) 发布 OpenResty: Nginx + LuaJIT, 在 worker 里跑 Lua 协程。Cloudflare 边缘多年跑这一套; 国内淘宝 / B 站 / 知乎 早期网关也是。Lua 第一次进"互联网基础设施"层。

  11. 2012·06

    Redis 2.6 — EVAL 让 Lua 跑进世界最大缓存

    antirez (Salvatore Sanfilippo) 在 Redis 2.6 加 EVAL, Lua 成了 Redis 内嵌的脚本语言。原子化复合操作的口子从此打开——亿万 web 后端默默调过 redis.call。Lua 选中的原因? 嵌入轻、零依赖、行为确定。

  12. 2015

    Lua 5.3 — 整数类型上线

    5.3 把整数加回来 (此前 Lua 只有 double)。//、位运算 & | ~ <<、字符串打包。重要但 LuaJIT 没跟——5.1 vs 5.3 的鸿沟拉得更深。

  13. 2015

    Mike Pall 退场公告

    LuaJIT 作者 Mike Pall 公开宣布退出主导开发, 寻找接班人。社区震动: 一个能跟 V8 比性能的项目, 从头到尾几乎都是他一个人写的。后续 fork (luajit2 OpenResty 维护、moonjit 等) 接力, 主线 LuaJIT 至今仍由社区维护更新。

  14. 2017

    Defold / Love2D 巩固独立游戏阵地

    King 把内部引擎 Defold 开源 (Lua 脚本); Love2D 持续被独立游戏开发者使用。加上 Garry's Mod + Factorio mod, "Lua = 游戏脚本事实标准"被进一步钉死。

  15. 2019·02

    Roblox 公开 Luau — Lua 的 typed fork

    Roblox 把内部 Lua fork 改名 Luau 并开源: 加渐进类型、加沙盒、移除 loadstring 等危险操作。Roblox 日活 ~7000 万玩家, 数百万开发者——Luau 是世界上活跃用户数最大的 Lua 方言。

  16. 2019·11

    Neovim 0.4 — Lua 成一等公民

    Neovim (Vim 的 2014 fork) 在 0.4 放出 嵌入 Lua 5.1。Bram Moolenaar 都承认过 "VimL 设计糟"; Neovim 团队用 LuaJIT 把这页翻过去。从此 nvim 配置 / 插件首选 Lua, VimL → Lua 的迁移浪潮启动。

  17. 2020·06

    Lua 5.4 — to-be-closed 变量

    5.4 加 <close> 属性 (RAII 风作用域结束自动 close)、改 GC 为分代式。语言层第一次有"资源管理"语义。但 LuaJIT 仍然只跟 5.1——分裂继续。

  18. 2020·07

    Neovim 0.5 + lua-first 插件浪潮

    0.5 放出完整 vim.api Lua 表面, telescope.nvim / nvim-treesitter / lazy.nvim 这一批 Lua-only 插件冒出来。两年内 Neovim 插件主流变成纯 Lua。

  19. 2022·04

    Redis 7.0 — Functions 上线, EVAL 被边缘化讨论

    Redis 加 Functions (持久化 Lua 函数), 一度有讨论"EVAL 何时弃用"。社区反弹强烈——Lua 早已嵌进无数生产代码。最终 Redis 7.4 把 Lua 重新定位为一等公民, 跟 Functions 并存。

  20. 2023·05

    Lua 5.4.6 + LuaJIT 2.1 final release candidates

    主线 Lua 进入 "小修小补" 稳态; LuaJIT 2.1 终于打出正式 RC, 性能微调。Lua 在 2023 年是"成熟到边边都收拾完"的状态——这是嵌入式语言最幸福的形态。

  21. 2026

    33 岁 — 在数千万嵌入位上跑着

    2026 年的 Lua 现状: 主线 5.4 稳定; LuaJIT 2.1 由社区 + OpenResty fork 维护; Luau 是最活跃方言 (Roblox 数千万日活); Neovim 是 Lua 的新身份门面; Redis / OpenResty / WoW / Factorio / Lightroom 老阵地不动。Lua 不抢风头, 它住在每个东西里面。

03

语言精要 : LuaAlphabet

8 张卡讲 Lua 跟其它语言最不一样的地方: table 当一切、metatable 当根、coroutine、closure、朴素 OOP、require、8 个类型、C ABI。第 9 张是"Python 超集"的反面: Lua 不试图替代 Python, 它选了完全相反的赛道。

A

table — 唯一的数据结构

Lua 只有一种复合类型: table。它同时是数组、字典、对象、namespace、module。把全部精力压在一个数据结构上, 优化得很扎实。

local t = {
    -- array part
    "hello", "world",
    -- hash part
    name = "lua",
    year = 1993,
}

print(t[1], t.name)
B

metatable — 一切高级抽象的根

OOP、运算符重载、读写代理、继承——全部由 metatable 一套机制实现。__index、__newindex、__add 等元方法是 Lua 的底层魔法。

local Vec = {}
Vec.__index = Vec
Vec.__add = function(a,b)
    return setmetatable({a.x+b.x}, Vec)
end
C

coroutine — 协程一等公民

1993 年就有协程的脚本语言。coroutine.create / yield / resume 三件套, 无 OS 线程开销。OpenResty 的并发模型核心就是 Lua 协程。

local co = coroutine.create(function()
    for i=1,3 do
        coroutine.yield(i)
    end
end)

print(coroutine.resume(co))  -- true 1
D

closure — 词法捕获 + upvalue

从 5.0 起 Lua 是真正的词法作用域语言, closure 捕获 upvalue。函数是一等值, 可塞 table、可作返回、可当参数。函数式风的工具基本都齐。

local function counter()
    local n = 0
    return function()
        n = n + 1
        return n
    end
end
E

OOP — 朴素到优雅

Lua 没有 class 关键字。OOP = table + metatable + : 语法糖 (self 注入)。20 行就能教会一个新手 OOP 怎么"长出来"。各引擎各自约定一种, 没有标准, 也不需要标准。

local Dog = {}
Dog.__index = Dog

function Dog.new(name)
    return setmetatable({name=name}, Dog)
end

function Dog:bark() print(self.name) end
F

require + package.path

模块系统极简: require "foo" 沿 package.path 查 ?.lua, 加载、缓存、返回。没有 npm-级别复杂度。LuaRocks 是社区事实包管理但不强制——很多项目仍 vendor 整个文件。

-- foo.lua
local M = {}
function M.hello() return "hi" end
return M

-- main.lua
local foo = require "foo"
G

类型: 仅 8 个

nil / boolean / number / string / function / userdata / thread / table——就这 8 个。整个语言能在两页纸讲完。Luau 在此基础上加了渐进类型, 但核心 Lua 保持纯净。

print(type(nil))       -- nil
print(type(true))     -- boolean
print(type(1))         -- number
print(type({}))        -- table
print(type(print))     -- function
H

C ABI — 嵌入易如反掌

Lua 是为嵌进 C 程序设计。lua_State*、lua_push* / lua_to* 栈机, 整个 API 极简且稳定——这是 WoW / Redis / Nginx / Lightroom 都选 Lua 的核心原因。

// C side
lua_State *L = luaL_newstate();
luaL_openlibs(L);
luaL_dostring(L, "print('hi')");
lua_close(L);
∞

反 Python 哲学 — 故意不长大

Python 30 年膨胀到 stdlib 上千万行、关键字几十个、PEP 几百条。Lua 30 年? 关键字仍 22 个, 核心 stdlib 仍 ~200 KB。Roberto 多次明确拒绝把语言"现代化": 不加类, 不加类型, 不加 async/await。这是 BDFL 主动选择不长大——保住嵌入位才是身份。

"把 Lua 加到不像 Lua 的样子, 我宁可不加。" — Roberto Ierusalimschy, paraphrased from talks

04

为何要用 : WhyLua

选 Lua 跟选 Python / Node 的决策维度不一样。Python 比生态; Lua 比"能不能塞进我的 C 程序"。这块没有第二选——Lua 在嵌入位上事实垄断 30 年。

⊙

200 KB — 整个解释器装一只小包里

Lua 5.4 编译后核心约 200 KB (Python 3 嵌入式构建 ~10-30 MB, Node ~50+ MB)。不是"轻量级"修辞——是真的小到可以塞硬件配置面板里。这是它能进 WoW 客户端、嵌入式设备、Redis worker 的第一前提。

-- lua-5.4.6 source
-- ~30 .c files
-- 0 external deps
-- builds on ANY C89 compiler
⌬

零依赖 — 任何 C 编译器都能编

Lua 严格用 ANSI C89, 不依赖 POSIX、不依赖 libc 高级功能。从 mainframe 到嵌入式 RTOS, 只要能跑 C 就能跑 Lua。这是"language as a library"的硬条件。

// embed in 3 lines
// no autoconf · no cmake
// gcc *.c -o lua
◐

嵌入哲学 — 你嵌 Lua, 不是 Lua 嵌你

Python / Node 的设计是"我管运行时, 你写脚本"; Lua 反过来——你的 C 程序是宿主, Lua 进来给你扩展力。这条哲学决定了 30 年间它住在每个游戏引擎、每个数据库、每个编辑器里面。

// 你的 C app
//   ├── 业务逻辑 (C)
//   └── lua_State (脚本钩子)
◑

LuaJIT — 一人作品 vs V8

Mike Pall 写的 LuaJIT 在数值循环上能跑赢 V8 / JVM——脚本语言里这是异常稀有现象。trace-based JIT + 极简 IR + 死磕底层。一个奥地利人, 几年, 把 JS 工业军团比下去。

-- LuaJIT 2.1 (5.1 compat)
-- trace JIT · loop hot-path
-- C FFI for zero-cost interop
◯

"5.1 永生" — 兼容性的祝福与诅咒

LuaJIT 钉 5.1, 整个嵌入式 / 网关 / 游戏圈跟着钉 5.1。10 年前的脚本现在还能跑——这是祝福。但 5.3 整数、5.4 RAII 在这条线上永远拿不到——这是诅咒。Lua 社区两线并行已成事实, 不再期待统一。

-- 5.1 line · OpenResty · WoW · Redis
-- 5.4 line · neovim host · mainline embed
-- both alive · both maintained
05

谁在用 : EmbeddedHallOfFame

Lua 的名单不夸张: 它确实住在你每天用的所有东西里。从 Roblox 到 WoW、Redis 到 Nginx、Neovim 到 Lightroom——嵌入式语言的名人堂。每一个都是真用户, 用了多年, 没在炒作。

Roblox · Luau
~7000 万日活 · Lua 方言
World of Warcraft
UI + addon 全是 Lua
Redis
EVAL · 内嵌脚本
Neovim
Lua 一等 · 插件首选
OpenResty
Nginx + LuaJIT · 边缘网关
JIT
LuaJIT
Mike Pall · 跨界性能怪兽
Lr
Adobe Lightroom
UI 大半 Lua · SDK 是 Lua
Factorio
整套 mod API · Lua
gm
Garry's Mod
所有 game mode · Lua
Defold
免费 2D 引擎 · King
Love2D
独立游戏 · Lua framework
Wireshark
协议解析器 · Lua dissector
06

嵌入哲学 : 200KB 装下一门语言

这一节是 Lua 的灵魂。30 年前 PUC-Rio 三人组做了一个朴素决定——不试图替代任何语言, 只做"宿主程序里的脚本层"。这个决定让 Lua 赢下了一整个 niche: 嵌入位。30 年没人能撼动。

"

我们从一开始就不想做"独立的"语言。Lua 的家是别人的程序——游戏引擎、数据库、配置面板。语言要小、要快、要能用一行 C 把脚本塞进去。我们做了这 30 年, 没改这个决定。

— Roberto IerusalimschyLua 主设计师 · PUC-Rio · 多次访谈 paraphrase

解释器尺寸对比 — 200 KB vs 一切

// 嵌入式构建 · 核心解释器 + 基础 stdlib

Lua 5.4
~200 KB
LuaJIT 2.1
~500 KB
MicroPython
~600 KB
Duktape (JS)
~700 KB
QuickJS
~1.2 MB
Wren
~350 KB
CPython (embed)
~12-30 MB
Node.js (V8)
~50+ MB
200 KB
核心解释器尺寸

Lua 5.4 编译后整个核心约 200 KB——可以塞进 80 年代级别的硬件。这不是"轻量级"修辞, 是架构决策: 解释器 + 词法 + 语法 + GC + stdlib 全部加起来 ~30 个 .c 文件。看完源码不需要一周。

22
保留关键字总数

22 个关键字就讲完整门 Lua: and / break / do / else / elseif / end / false / for / function / goto / if / in / local / nil / not / or / repeat / return / then / true / until / while。Python 30+, JS 60+, Rust 50+——Lua 30 年没膨胀。

0 deps
外部依赖

构建 Lua 不需要 autoconf、不需要 cmake、不需要 libffi、不需要任何东西。gcc *.c -o lua。能跑 C89 的地方就能跑 Lua: 大型机、嵌入式 RTOS、PS3、ESP32、路由器固件。这是它住进每个东西的"硬条件"。

LuaJIT — 脚本语言里的异常值// Mike Pall · 一人作品

2005 年, 奥地利程序员 Mike Pall 一个人写出 LuaJIT: trace-based JIT + 极简 IR + 高度手工调优。这是 Lua 故事里最反常的一段——一个工业级 JIT, 整个由一个人写出来, 性能在数值循环上能跑赢 Google 几百人写的 V8。

LuaJIT 锁在 Lua 5.1 兼容——这是它的祝福也是诅咒。祝福: 整个嵌入式 / 网关 / 游戏圈都跟着锁 5.1, ABI 稳定 20 年。诅咒: Lua 5.3 的整数、5.4 的 <close> 永远拿不到。OpenResty 维护的 luajit2 fork 在主线补丁基础上加企业级修复, 是 2026 年事实活跃版本之一。

2015 年 Mike Pall 公开表态退出主导开发找接班人。十年过去, 没有真正的"下一个 Mike Pall"——这是 LuaJIT 长期最大的不确定性。但项目仍由社区维护, 2023 年才打出官方 2.1 RC。一人作品的命运永远悬在那里。

SPOTLIGHT

Redis EVAL — Lua 进世界最大缓存 — 2012

2012 年 antirez 给 Redis 加 EVAL——把 Lua 当作内嵌脚本语言。这一个动作让 Lua 通过 Redis 静悄悄进了几亿个 web 后端。每次 redis.call 都是 Lua VM 在跑。

  • atomicity — 一个 EVAL 是一次 Redis 原子操作
  • 200 KB embed — Redis 二进制几乎没变胖
  • deterministic — 同输入 → 同输出, 适合 replication
  • Functions (7.0) — 持久化版 EVAL · Lua 仍是底层

2022 年 Redis 7.0 一度讨论"EVAL 是否弃用", 社区反弹强烈; Redis 7.4 把 Lua 重新定位为一等公民, 跟 Functions 并存。嵌入式语言的位置一旦坐稳, 几乎拔不掉。

-- Redis EVAL · atomic compare-and-set
local cur = redis.call("GET", KEYS[1])
if cur == ARGV[1] then
    redis.call("SET", KEYS[1], ARGV[2])
    return 1
else
    return 0
end

# client side
# EVAL "..." 1 mykey oldval newval
# → 1 (swapped) or 0 (skipped)

-- 一个 EVAL = 一次原子操作
-- 几亿 web 后端默默调过

2026 生态 / 工具 / 方言

LuaRocks
社区包管理器
LuaJIT 2.1
5.1 兼容 · trace JIT
OpenResty
Nginx + Lua · 网关
Luau
Roblox · 渐进类型
Fennel
Lisp 风方言 → Lua
Teal
静态类型 Lua
Moonscript
CoffeeScript 风 → Lua
lua-language-server
LSP 实现 (sumneko)
Penlight
通用工具库 (stdlib+)
busted
测试框架
lapis
Web 框架 (OpenResty)
TIC-80 / PICO-8
幻想 console · Lua
NEOVIM

VimL → Lua — 编辑器圈的 Lua 时刻

2014 年 Neovim 从 Vim fork, 2019 年放出嵌入 Lua 5.1。这步动作改了 Lua 的公共身份: 过去 30 年它的形象是"游戏里的脚本"; 2020 年后变成"开发者每天写的 init.lua"。

2020-2026 的插件浪潮: telescope.nvim (模糊搜索)、nvim-treesitter (语法树)、lazy.nvim (插件管理)、nvim-lspconfig (LSP)——全是 纯 Lua。VimScript 沦为遗产, Vim 9.0 出 Vim9script 也救不回来。

有趣的是: Neovim 嵌的是 LuaJIT (5.1 兼容), 不是主线 5.4。"5.1 永生"现象在 2026 年又一次被钉死: 主线版本永远走不进 LuaJIT 生态。

-- ~/.config/nvim/init.lua
-- 一个文件取代了几百行 .vimrc

local vim = vim
vim.opt.number = true
vim.opt.tabstop = 4

-- LSP: 一行启动 rust-analyzer
require("lspconfig").rust_analyzer.setup{}

-- 快捷键: Lua 表 + 函数
vim.keymap.set("n", "<leader>ff",
    require("telescope.builtin").find_files)

-- 整个配置可以热重载
-- 这是 VimL 30 年做不到的

一句话总结: Lua 不是 "下一代 Python", 也不是 "更快的 JavaScript"——它是"住在你 C 程序里的脚本" 这个 niche 的事实垄断者。30 年没人撼动, 33 岁仍在长。

07

对比 : Lua vs Python vs JS

跟 Python 比: Lua 是 Python 的反面——故意小, 故意 niche。跟 JS 比: 都是 1990 年代生的动态脚本, 但 JS 把生态压到浏览器, Lua 压到嵌入。跟 C 比: Lua 的家就是 C, 共生关系不是替代关系。

PythonLuaJavaScript
出身Guido · 1991PUC-Rio · 1993Brendan Eich · 1995
设计师Guido van RossumR. Ierusalimschy + 2Brendan Eich
设计目标可读 · 通用脚本嵌进 C · 小 · 可移植浏览器表单胶水
核心大小嵌入式 ~10-30 MB~200 KBV8 ~50+ MB · QuickJS ~1 MB
关键字数~3522~60
数据结构list / dict / tuple / set / ...table 一个顶七个Array / Object / Map / Set / ...
OOPclass 关键字metatable 拼出来 · 无关键字class (ES6) + prototype
协程asyncio (后加) · generators1993 起一等公民async/await (ES2017)
性能 (typed loop)CPython 慢 · PyPy 中等LuaJIT 跟 V8 同档V8 · 最强 JIT 之一
嵌入易度难 · libpython 巨大5 行 C 搞定 · 200 KBQuickJS 可以 · V8 不可能
生态规模PyPI ~50 万包LuaRocks ~5000 · vendor 居多npm ~250 万包
典型场景数据 · ML · web · 脚本游戏脚本 · 配置 · 嵌入浏览器 · Node · 全栈
08

前景 : TheRoadAhead

Lua 2026 年的核心问题不是"怎么发展", 是"谁能撼动嵌入位"。30 年没有真威胁。主线 5.4 稳定, LuaJIT 接班悬而未决, Luau 接管类型化需求, Neovim 把它推上新一代开发者桌面。这是一门已经赢过的语言, 在守自己赢来的地。

HOT · 2026+

Luau 的崛起 — 类型化 Lua 是不是未来?

Roblox 的 Luau 给 Lua 加渐进类型、加沙盒、移除危险操作 (loadstring、setfenv)。它不是分裂主线——而是给"需要类型的 Lua 用户" 一个完整答案。日活规模 ~7000 万, 数百万开发者在写。

意义: Lua 主线一直回避加类型 (Roberto 明确表态)。Luau 让"想要类型的人"另立一支, 主线保持纯净。这是 BDFL 语言设计的成熟形态: 不"all things to all people", 让方言去满足子需求。

主线 Lua 加类型 (历来拒绝)~0%
Luau 接管类型需求100%
NVIM

Neovim — Lua 的"新身份"

过去 30 年 Lua 的大众形象都是"游戏引擎里的脚本"。2020 年后 Neovim 把它推上开发者工具桌面——~/.config/nvim/init.lua 已经是数百万开发者每天写的文件。这是 Lua 身份的扩展: 从游戏圈走到编辑器圈。

LUAJIT

LuaJIT 的接班问题

Mike Pall 2015 年退后, LuaJIT 没有出现真正的"下一个 Mike Pall"。社区维护稳定但大改革停摆。OpenResty 的 luajit2 fork 补一些, moonjit 试过更激进的改, 主线仍是事实标准。能不能在 GPU / WASM 等新目标上跟上, 是开放问题。

EMBED

嵌入位仍在长 — IoT / 边缘

Lua 的200 KB + 零依赖属性在 2026 年比 1996 年更值钱: ESP32 / RP2040 等小芯片直接跑 Lua, 路由器 / 工业控制器把 Lua 作配置层。"language as a library" 是个永不过时的市场——而 Lua 在这块没有真正的对手 (MicroPython 体积大数倍)。

官方资源

  • lua.org
  • Programming in Lua
  • Reference Manual 5.4
  • GitHub · lua/lua
  • Lua Workshop

LuaJIT / 方言

  • luajit.org
  • github · LuaJIT/LuaJIT
  • openresty/luajit2
  • luau.org (Roblox)
  • github · luau-lang/luau

生态 / 嵌入

  • openresty.org
  • neovim.io
  • LuaRocks
  • Love2D
  • Defold

同站交叉

  • Python — Lua 的反面
  • C — Lua 的家
  • JavaScript — 同代脚本
  • Rust — 系统语言对照

单页中文 / English 双语 · 资料截至 2026-05

-- "lua" is Portuguese for moon