本文深入分析 Lua 5.1 虛擬機器對賦值語句 foo = "bar"; local a, b = "a", "b"; foo = a 的詞法分析、語法分析與位元碼生成全過程,並使用 ChunkSpy 工具檢視生成指令。
[0] LOADK 0 1 ; "bar"
[1] SETGLOBAL 0 0 ; foo
[2] LOADK 0 2 ; "a"
[3] LOADK 1 3 ; "b"
[4] SETGLOBAL 0 0 ; foo = a
[5] RETURN 0 1
luaY_parser 初始化 LexState、FuncState,進入 chunk 解析主迴圈。statement 根據 token 分派,賦值語句進入 exprstat。exprstat 呼叫 primaryexp -> prefixexp -> singlevar 解析左值變數。singlevaraux 遞迴查找變數作用域(local -> upvalue -> global)。assignment 處理多重賦值,呼叫 explist1 解析右值。luaK_storevar 根據左值類型生成 SETGLOBAL/SETLOCAL/SETUPVAL 指令。luaK_exp2anyreg -> discharge2reg 生成 LOADK。expdesc:表達式描述,含類型 k (VGLOBAL/VLOCAL/VK/...)、資訊 info、輔助 aux。LHS_assign:左值鏈表,支援多重賦值 a,b,c = ...。FuncState:函數編譯狀態,含常數表、原型、暫存器分配器。local a, b = "a", "b" 時,LHS_assign 串聯兩個 expdesc,explist1 解析兩個右值,adjust_assign 對齊左右數量,最後逐個 luaK_storevar。
lparser.c, lcode.c, ldo.c。理解 VM 位元碼生成有助於優化 Lua 程式、編寫編譯器工具或除錯效能問題。