Lua是一門設(shè)計精簡、功能強大的腳本語言。本書將Lua解釋器拆解,使用C語言,一步一步構(gòu)建能夠正確運行的Lua解釋器。本書共6章,分別為Lua解釋器概述,Lua虛擬機,Lua腳本的編譯與虛擬機指令運行流程,Lua編譯器,Lua的解釋器的其他基礎(chǔ)特征,dummylua開發(fā)案例:俄羅斯方塊。閱讀本書,并不需要讀者事先精通有關(guān)編譯原理的知識,書中會嘗試用簡潔的語言,向讀者介紹相關(guān)的具體內(nèi)容。
Lua解釋器構(gòu)建:從虛擬機到編譯器面向?qū)ua內(nèi)部以及解釋器的設(shè)計和實現(xiàn)感興趣的讀者,并要求讀者對C語言和Lua有一定的了解和使用經(jīng)驗。本書免費提供書中配套案例的全部源碼,相關(guān)獲取方式見封底。
序
前言
第1章 Lua解釋器概述/
1.1 Lua解釋器/
1.1.1 Lua解釋器的整體架構(gòu)/
1.1.2 Lua解釋器的運行機制/
1.2 Lua虛擬機/
1.2.1 虛擬機簡介/
1.2.2 虛擬機指令的編碼方式/
1.2.3 虛擬機指令集/
1.3 Lua編譯器/
1.3.1 Lua的詞法分析器/
1.3.2 Lua的語法分析器/
1.4 從0開發(fā)一個Lua解釋器:dummylua項目/
1.4.1 項目簡介/
1.4.2 項目架構(gòu)說明/
第2章 Lua虛擬機/
2.1 Lua虛擬機基礎(chǔ)知識/
2.1.1 基本類型定義/
2.1.2 虛擬機全局狀態(tài)——global_State/
2.1.3 虛擬機的線程結(jié)構(gòu)——lua_State/
2.1.4 虛擬機中執(zhí)行函數(shù)的基礎(chǔ)——CallInfo結(jié)構(gòu)/
2.1.5 C函數(shù)在虛擬機線程中的調(diào)用流程/
2.1.6 虛擬機異常處理機制/
2.1.7 dummylua項目的虛擬機基礎(chǔ)實現(xiàn)/
2.2 為虛擬機添加垃圾回收機制/
2.2.1 標(biāo)記清除算法/
2.2.2 增量式標(biāo)記清除算法/
2.2.3 dummylua項目的垃圾回收機制實現(xiàn)/
2.3 Lua虛擬機的字符串/
2.3.1 Lua字符串概述/
2.3.2 Lua字符串結(jié)構(gòu)/
2.3.3 字符串的哈希運算/
2.3.4 短字符串與內(nèi)部化/
2.3.5 長字符串與惰性哈希/
2.3.6 Lua-5.2的Hash DoS攻擊/
2.3.7 dummylua的字符串實現(xiàn)/
2.4 Lua虛擬機的表/
2.4.1 Lua表功能概述/
2.4.2 Lua表的基本數(shù)據(jù)結(jié)構(gòu)/
2.4.3 表的初始化/
2.4.4 鍵值的哈希運算/
2.4.5 查找元素/
2.4.6 值的更新與插入/
2.4.7 調(diào)整表的大小/
2.4.8 表遍歷/
2.4.9 dummylua的表實現(xiàn)/
第3章 Lua腳本的編譯與虛擬機指令運行流程 /
3.1 第一個編譯并運行腳本的例子:讓Lua說“hello world”/
3.2 Lua的整體編譯和運行流程/
3.3 虛擬機如何運行編譯后的指令/
3.4 虛擬機輸出“hello world”的例子/
3.5 反編譯工具——protodump/
3.5.1 protodump工具簡介/
3.5.2 使用protodump反編譯Lua的字節(jié)碼/
3.5.3 反編譯結(jié)果分析/
3.6 標(biāo)準(zhǔn)庫加載流程/
3.7 Lua內(nèi)置編譯器補充說明/
3.7.1 EBNF簡介/
3.7.2 本章定義的EBNF/
3.7.3 詞法分析器設(shè)計與實現(xiàn)/
3.7.4 語句和表達式/
3.7.5 語法分析器的基礎(chǔ)設(shè)計與實現(xiàn)/
3.8 讓dummylua能夠編譯并運行“hello world”腳本/
第4章 Lua編譯器/
4.1 Lua詞法分析器 /
4.1.1 詞法分析器簡介/
4.1.2 詞法分析器基本數(shù)據(jù)結(jié)構(gòu)/
4.1.3 詞法分析器的接口設(shè)計/
4.1.4 詞法分析器的初始化流程/
4.1.5 token識別流程/
4.1.6 一個測試用例/
4.1.7 dummylua的詞法分析器實現(xiàn)/
4.2 Lua語法分析器基礎(chǔ)——expr語句編譯流程/
4.2.1 語法分析器的主要工作/
4.2.2 實現(xiàn)的語法/
4.2.3 語法分析器基本數(shù)據(jù)結(jié)構(gòu)/
4.2.4 編譯邏輯與EBNF的關(guān)聯(lián)/
4.2.5 exprstat的邏輯結(jié)構(gòu)/
4.2.6 expr的構(gòu)造與編譯/
4.2.7 suffixedexp構(gòu)造與編譯/
4.2.8 assignment構(gòu)造和編譯/
4.2.9 為dummylua添加編譯exprstat的功能/
4.3 完整的Lua語法分析器/
4.3.1 Lua的語句塊/
4.3.2 local語句編譯流程/
4.3.3 doend語句編譯流程/
4.3.4 if語句編譯流程/
4.3.5 while語句編譯流程/
4.3.6 repeat語句編譯流程/
4.3.7 for語句編譯流程/
4.3.8 break語句編譯流程/
4.3.9 function語句編譯流程/
4.3.10 return語句編譯流程 /
4.3.11 dummylua的完整語法分析器實現(xiàn)/
第5章 Lua解釋器的其他基礎(chǔ)特性/
5.1 元表/
5.1.1 元表簡介/
5.1.2 元表的_index域/
5.1.3 元表的_newindex域/
5.1.4 雙目運算事件/
5.1.5 dummylua的元表實現(xiàn)/
5.2 用戶數(shù)據(jù)/
5.2.1 用戶數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)/
5.2.2 用戶數(shù)據(jù)的接口/
5.2.3 用戶數(shù)據(jù)的垃圾回收處理/
5.2.4 用戶數(shù)據(jù)的user domain域內(nèi)部的堆內(nèi)存清理/
5.2.5 用戶數(shù)據(jù)的測試用例/
5.2.6 dummylua的用戶數(shù)據(jù)實現(xiàn)/
5.3 上值/
5.3.1 上值的定義/
5.3.2 Lua函數(shù)的探索/
5.3.3 上值的生成/
5.3.4 開放上值和已關(guān)閉上值/
5.3.5 dummylua的上值實現(xiàn)/
5.4 弱表 /
5.4.1 弱表的定義/
5.4.2 弱表的用途/
5.4.3 弱鍵/
5.4.4 弱值/
5.4.5 完全弱引用/
5.4.6 dummylua的弱表實現(xiàn)/
5.5 require機制 /
5.5.1 require功能簡述/
5.5.2 package初始化/
5.5.3 require運作流程/
5.5.4 dummylua的require機制實現(xiàn)/
第6章 dummylua開發(fā)案例:俄羅斯方塊/
6.1 案例簡介/
6.2 案例代碼結(jié)構(gòu)/
6.3 編譯與運行/
附錄/
附錄A Lua虛擬機指令集/
附錄B Lua的EBNF語法/