它是什么

LuaJIT 是 Mike Pall 写的另一份 Lua 实现——Tracing JIT 编译器,速度通常是标准 Lua 的 3-50 倍。

兼容 Lua 5.1 语法 + 借鉴 5.2/5.3 的部分(goto__pairs 等),但不是 5.4 兼容

几个事实

  • 2.0 稳定(2012);2.1 于 2024-05 正式发布稳定版(此前长期处于 beta,但生产已大规模使用)
  • 维护:作者 Mike Pall 早已半退休,社区接手(OpenResty 等公司持续投入)
  • 一些大用户:OpenResty / Nginx-Lua、Cloudflare、Redis(曾用,5.0+ 切回纯 Lua)、Roblox(前期)、World of Warcraft(早期)

为什么快

Tracing JIT:解释器执行时记录"热路径"——多次执行的代码被编译成机器码、内联、消除冗余。整数运算、浮点运算、表访问、调用——都能被优化到接近 C 的速度。

但是:JIT 假设代码"热"——只跑一两次的代码不会被编译,依然走解释器。

装 + 跑

brew install luajit         # macOS
sudo apt install luajit     # Debian/Ubuntu

luajit -v        # LuaJIT 2.1.x

luajit script.lua            # 像跑标准 Lua 一样

关闭 JIT(调试 / 对比用)

luajit -joff script.lua

或代码里:

jit.off()

FFI:直接调 C

LuaJIT 招牌功能——不写胶水代码调任何 C 库:

local ffi = require("ffi")

ffi.cdef[[
typedef struct { double x, y; } Point;
double sqrt(double x);
int printf(const char *fmt, ...);
]]

print(ffi.C.sqrt(16))    -- 4

local p = ffi.new("Point", {3, 4})
print(p.x, p.y)
ffi.C.printf("(%g, %g)\n", p.x, p.y)

调用速度近乎零开销(远快于 Lua 5.x 的 C 模块绑定)。游戏 / 科学计算 / 网络密集场景必备。

不能用 5.3+ 的新东西

-- 5.3+:整数 / 位运算
local x = 0xF0 & 0x0F    -- LuaJIT 报错

-- 5.4:to-be-closed
do
    local f <close> = io.open(...)
end
-- LuaJIT 报错

-- 5.3+:goto + label 部分语法
::label::                -- 这个 LuaJIT 支持
5.3+ 特性 LuaJIT 支持
整数子类型 ❌(永远 double)
位运算操作符 & | ~ ❌(用 bit 库)
goto/<close> goto ✅,close ❌
// 整数除法 ❌(用 math.floor(a/b)
\u{...} Unicode 转义
string.pack/unpack

写 LuaJIT 项目要按 5.1 + LuaJIT 扩展的子集写。

性能写法(LuaJIT 友好)

LuaJIT 有些代码模式特别快,有些会让 JIT 放弃:

-- ✅ 紧致数值循环、ffi 类型 → JIT 起飞
local ffi = require("ffi")
local arr = ffi.new("double[1000000]")
for i = 0, 999999 do arr[i] = math.sqrt(i) end

-- ❌ 在热路径用 pcall / xpcall → 抑制 JIT
-- ❌ 字符串模式匹配 → 大概率走解释器
-- ❌ 长 string.format → JIT 不友好

详见官方 Numerical-Computing-Performance-Guide

看 JIT 在做什么

luajit -jv script.lua    -- 打印 trace 信息
luajit -jdump script.lua -- 详细 IR 输出(调试用)

选不选 LuaJIT

不选
OpenResty / 嵌入到 C/C++ 想用 Lua 5.4 新特性
数值密集 / 游戏 项目限定标准 Lua(Redis、Lightroom)
已习惯 5.1 + 需要速度 团队偏好维护活跃的官方 Lua

也可以两个都装——开发用标准 Lua 检查语法(lua-language-server 在 5.4 模式严格),跑生产用 LuaJIT。

→ 下一篇 在 Roblox 写 Lua