自己動(dòng)手實(shí)現(xiàn)Lua:虛擬機(jī)、編譯器和標(biāo)準(zhǔn)庫
定 價(jià):89 元
叢書名:自己動(dòng)手系列
- 作者:張秀宏 著
- 出版時(shí)間:2018/10/1
- ISBN:9787111610229
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP317.6
- 頁碼:412
- 紙張:膠版紙
- 版次:1
- 開本:16開
本書是一本面向Lua程序員和腳本語言愛好者的語言自制指南和實(shí)戰(zhàn)寶典。作者融合自己豐富的工程實(shí)踐經(jīng)驗(yàn),詳細(xì)闡述Lua語言的核心語法和實(shí)現(xiàn)原理,深入探討Lua虛擬機(jī)、編譯器和標(biāo)準(zhǔn)庫,并給出了實(shí)際可以編譯執(zhí)行的代碼。助你從零基礎(chǔ)開始編程實(shí)現(xiàn)Lua語言,徹底理解腳本語言工作原理。全書分為3個(gè)部分,共21章。部分主要討論LuaAPI和虛擬機(jī)實(shí)現(xiàn),包括二進(jìn)制chunk格式、Lua虛擬機(jī)指令集、元編程、錯(cuò)誤處理等。第二部分主要討論Lua語法和編譯器實(shí)現(xiàn),包括詞法分析、語法分析、代碼優(yōu)化、代碼生成等。第三部分主要討論Lua輔助API和標(biāo)準(zhǔn)庫實(shí)現(xiàn),包括基礎(chǔ)庫、實(shí)用工具庫、包和模塊、協(xié)程等。
適讀人群 :主要面對(duì)三類人群:?對(duì)腳本語言實(shí)現(xiàn)原理感興趣?對(duì)編譯原理和虛擬機(jī)感興趣?對(duì)Lua語言感興趣,想探究其內(nèi)部實(shí)行
(1)作者是的服務(wù)器開發(fā)工程師和架構(gòu)師,精通Java、GO和Lua等語言,對(duì)高級(jí)語言的虛擬機(jī)有深入研究,《自己動(dòng)手寫Java虛擬機(jī)》作者。
(2)本書3大內(nèi)容特色:零基礎(chǔ)自制編程語言、徹底掌握Lua語言實(shí)現(xiàn)原理和工作機(jī)制、提升Go和Java語言編程能力。
(3)本書得到了七牛云創(chuàng)始人兼CEO等大佬的高度評(píng)價(jià)和推薦。
為什么編寫本書
Lua是一門強(qiáng)大、高效、輕量、可嵌入的腳本語言。Lua語言設(shè)計(jì)十分精巧,在一個(gè)很小的內(nèi)核上可以支持函數(shù)式編程、面向?qū)ο缶幊、元編程等多種編程范式。以本書完稿時(shí)的最新版本Lua 5.3.4為例,全部代碼(包括Lua虛擬機(jī)、編譯器、標(biāo)準(zhǔn)庫等)僅有2萬多行,這其中還包括注釋和空行。
Lua語言大約于1993年誕生于巴西PUC-Rio大學(xué),之后在游戲領(lǐng)域大放異彩,被很多游戲客戶端選為腳本語言,比如知名游戲《魔獸世界》《模擬城市4》《憤怒的小鳥》等。很多流行的游戲引擎也選擇Lua作為腳本語言,比如CryENGINE2、Cocos2d-x及Corona SDK等。另外,也有很多游戲服務(wù)端采用C/C++搭配Lua的開發(fā)模式。除了游戲領(lǐng)域,Lua語言在其他地方也有很多應(yīng)用,例如被廣泛使用的NoSQL數(shù)據(jù)庫Redis就使用Lua作為腳本語言擴(kuò)展其能力。
相信自己動(dòng)手設(shè)計(jì)并實(shí)現(xiàn)一門編程語言是每個(gè)程序員都會(huì)有的一個(gè)夢(mèng)想,目前國(guó)內(nèi)也已經(jīng)出版或引進(jìn)了一些指導(dǎo)讀者自己實(shí)現(xiàn)編程語言的書籍。不過這些書籍要么只介紹了語言實(shí)現(xiàn)環(huán)節(jié)中的一小部分,無法縱觀全局;要么只討論某種大幅裁減后的簡(jiǎn)化語言,離真正的工業(yè)語言還有一定距離。例如,我自己的《自己動(dòng)手寫Java虛擬機(jī)》,只討論了Java虛擬機(jī)實(shí)現(xiàn),沒有涉及Java編譯器和Java標(biāo)準(zhǔn)庫。
如上所述,之所以選擇Lua語言,就是因?yàn)樗銐蛐∏桑⑶矣泻芎玫牧餍卸。麻雀雖小,五臟俱全,這使得我們可以在一本書的篇幅范圍內(nèi)覆蓋虛擬機(jī)、編譯器、標(biāo)準(zhǔn)庫這三個(gè)方面的內(nèi)容。希望讀者可以通過本書完整體驗(yàn)一門編程語言的實(shí)現(xiàn)過程,為將來打造屬于自己的語言做好準(zhǔn)備。這正是本書的與眾不同之處。
本書主要內(nèi)容
本書主要內(nèi)容可以分為四個(gè)部分:第一部分(第1章)為準(zhǔn)備工作;第二部分(第2~ 13章)主要討論Lua虛擬機(jī)和Lua API;第三部分(第14~17章)主要討論Lua語法和編譯器,第四部分(第18~21章)主要討論Lua標(biāo)準(zhǔn)庫。
全書共21章,各章內(nèi)容安排如下:
第一部分(準(zhǔn)備)
第1章:準(zhǔn)備工作。
準(zhǔn)備編程環(huán)境,編寫“Hello,World!”程序。
第二部分(Lua虛擬機(jī)和Lua API)
第2章:二進(jìn)制chunk。
介紹Lua二進(jìn)制chuck文件格式,編寫代碼解析二進(jìn)制chunk文件。
第3章:指令集
介紹Lua虛擬機(jī)指令集和指令編碼格式,編寫代碼對(duì)指令進(jìn)行解碼。
第4章:Lua API
初步介紹Lua API和Lua State,實(shí)現(xiàn)棧相關(guān)API方法。
第5章:Lua運(yùn)算符
介紹Lua語言運(yùn)算符,給Lua API添加運(yùn)算符相關(guān)方法。
第6章:虛擬機(jī)雛形
初步實(shí)現(xiàn)Lua虛擬機(jī),可以解釋執(zhí)行大約一半的Lua虛擬機(jī)指令。
第7章:表
介紹并實(shí)現(xiàn)Lua表、表相關(guān)API方法,以及表相關(guān)指令。
第8章:函數(shù)調(diào)用
介紹并實(shí)現(xiàn)Lua函數(shù)調(diào)用。
第9章:Go函數(shù)調(diào)用
介紹如何在Lua中調(diào)用Go語言函數(shù)。
第10章:閉包和Upvalue
介紹并實(shí)現(xiàn)閉包和Upvalue,以及Upvalue相關(guān)指令。
第11章:元編程
介紹并實(shí)現(xiàn)Lua元表、元方法及元編程。
第12章:迭代器
介紹并實(shí)現(xiàn)Lua迭代器。
第13章:異常和錯(cuò)誤處理
介紹Lua異常和錯(cuò)誤處理機(jī)制。
第三部分(Lua語法和編譯器)
第14章:詞法分析
介紹Lua語言詞法規(guī)則,實(shí)現(xiàn)詞法分析器。
第15章:抽象語法樹
初步介紹Lua語言語法規(guī)則,定義抽象語法樹。
第16章:語法分析
進(jìn)一步介紹Lua語言語法規(guī)則,編寫語法分析器。
第17章:代碼生成
編寫代碼生成器。
第四部分(Lua標(biāo)準(zhǔn)庫)
第18章:輔助API和基礎(chǔ)庫
介紹Lua輔助API和標(biāo)準(zhǔn)庫,實(shí)現(xiàn)基礎(chǔ)庫。
第19章:工具庫
介紹并實(shí)現(xiàn)數(shù)學(xué)、表、字符串、UTF-8、OS等標(biāo)準(zhǔn)庫。
第20章:包和模塊
介紹Lua包和模塊機(jī)制,實(shí)現(xiàn)package標(biāo)準(zhǔn)庫。
第21章:協(xié)程
介紹Lua協(xié)程,實(shí)現(xiàn)coroutine標(biāo)準(zhǔn)庫。
本書面向的讀者
本書假定讀者已經(jīng)了解Go語言和Lua語言,所以不會(huì)對(duì)這兩種語言的語法進(jìn)行專門介紹。本書使用Go語言實(shí)現(xiàn)Lua解釋器,但并沒有用到特別高深的技術(shù),加之Go語言語法比較簡(jiǎn)單,相信有C系列語言(比如C、C++、C#、Java等)基礎(chǔ)的程序員都可以輕松讀懂書中的代碼。此外,如果讀者更加熟悉Java語言,本書也提供了Java版實(shí)現(xiàn)代碼。簡(jiǎn)而言之,本書主要面向以下三類讀者:
對(duì)腳本語言實(shí)現(xiàn)原理感興趣的讀者。
對(duì)編譯原理和高級(jí)語言虛擬機(jī)感興趣的讀者。
對(duì)Lua語言感興趣,想探究其內(nèi)部實(shí)現(xiàn)的讀者。
如何閱讀本書
本書內(nèi)容主要圍繞代碼對(duì)Lua虛擬機(jī)、編譯器和標(biāo)準(zhǔn)庫展開討論。本書代碼經(jīng)過精心安排,除第1章外,每一章都建立在前一章的基礎(chǔ)之上,但每一章又都可以單獨(dú)編譯和運(yùn)行。建議讀者從第1章開始,按順序閱讀本書并學(xué)習(xí)每一章的代碼。但也可以直接跳到感興趣的章節(jié)進(jìn)行閱讀,必要時(shí)再閱讀其他章節(jié)。
參考資料
相比C/C++、Java、Python等主流語言,Lua算是較為小眾的語言,因此能夠找到的介紹其內(nèi)部實(shí)現(xiàn)原理和細(xì)節(jié)的資料并不多,這也是本書寫作的動(dòng)機(jī)之一。除了Lua官方實(shí)現(xiàn)的源代碼,本書在寫作過程中主要參考了下面這些資料:
《Programming in Lua, Fourth Edition》
《Lua 5.3 Reference Manual》
《The Evolution of Lua》
《The Implementation of Lua 5.0》
《A No-Frills Introduction to Lua 5.1 VM Instructions》
《Lua 5.3 Bytecode Referenc
張秀宏
服務(wù)器開發(fā)工程師,有多年的Java和游戲服務(wù)器開發(fā)和架構(gòu)經(jīng)驗(yàn),對(duì)高級(jí)語言虛擬機(jī)有非常深入的研究。曾在EA、樂元素等游戲公司擔(dān)任高級(jí)服務(wù)器工程師,現(xiàn)任某創(chuàng)業(yè)公司架構(gòu)師。
曾于2016年6月出版《自己動(dòng)手寫Java虛擬機(jī)》一書,廣受讀者好評(píng),并多次重印!蹲约簞(dòng)手實(shí)現(xiàn)Lua:虛擬機(jī)、編譯器、標(biāo)準(zhǔn)庫》是他時(shí)隔兩年之后推出的又一力作。
前言
第一部分 準(zhǔn)備
第1章 準(zhǔn)備工作 3
1.1 準(zhǔn)備開發(fā)環(huán)境 3
1.1.1 操作系統(tǒng) 3
1.1.2 安裝Lua 4
1.1.3 安裝Go 4
1.2 準(zhǔn)備目錄結(jié)構(gòu) 4
1.3 本章小結(jié) 6
第二部分 Lua虛擬機(jī)和Lua API
第2章 二進(jìn)制chunk 9
2.1 什么是二進(jìn)制chunk 10
2.2 luac命令介紹 11
2.2.1 編譯Lua源文件 11
2.2.2 查看二進(jìn)制chunk 13
2.3 二進(jìn)制chunk格式 15
2.3.1 數(shù)據(jù)類型 16
2.3.2 總體結(jié)構(gòu) 17
2.3.3 頭部 18
2.3.4 函數(shù)原型 22
2.4 解析二進(jìn)制chunk 27
2.4.1 讀取基本數(shù)據(jù)類型 28
2.4.2 檢查頭部 29
2.4.3 讀取函數(shù)原型 30
2.5 測(cè)試本章代碼 33
2.6 本章小結(jié) 36
第3章 指令集 37
3.1 指令集介紹 37
3.2 指令編碼格式 38
3.2.1 編碼模式 38
3.2.2 操作碼 39
3.2.3 操作數(shù) 40
3.2.4 指令表 41
3.3 指令解碼 42
3.4 測(cè)試本章代碼 44
3.5 本章小結(jié) 47
第4章 Lua API 49
4.1 Lua API介紹 49
4.2 Lua棧 51
4.2.1 Lua數(shù)據(jù)類型和值 51
4.2.2 棧索引 54
4.2.3 定義luaStack結(jié)構(gòu)體 54
4.3 Lua State 57
4.3.1 定義LuaState接口 57
4.3.2 定義luaState結(jié)構(gòu)體 58
4.3.3 基礎(chǔ)棧操縱方法 59
4.3.4 Push方法 64
4.3.5 Access方法 65
4.4 測(cè)試本章代碼 69
4.5 本章小結(jié) 70
第5章 Lua運(yùn)算符 71
5.1 Lua運(yùn)算符介紹 71
5.2 自動(dòng)類型轉(zhuǎn)換 75
5.3 擴(kuò)展LuaState接口 79
5.3.1 Arith()方法 80
5.3.2 Compare()方法 83
5.3.3 Len()方法 85
5.3.4 Concat()方法 86
5.4 測(cè)試本章代碼 87
5.5 本章小結(jié) 88
第6章 虛擬機(jī)雛形 89
6.1 添加LuaVM接口 89
6.1.1 定義LuaVM接口 91
6.1.2 改造luaState結(jié)構(gòu)體 92
6.1.3 實(shí)現(xiàn)LuaVM接口 93
6.2 實(shí)現(xiàn)Lua虛擬機(jī)指令 94
6.2.1 移動(dòng)和跳轉(zhuǎn)指令 94
6.2.2 加載指令 96
6.2.3 算術(shù)運(yùn)算指令 101
6.2.4 長(zhǎng)度和拼接指令 103
6.2.5 比較指令 106
6.2.6 邏輯運(yùn)算指令 107
6.2.7 for循環(huán)指令 110
6.3 指令分派 113
6.4 測(cè)試本章代碼 115
6.5 本章小結(jié) 118
第7章 表 119
7.1 表介紹 119
7.2 表內(nèi)部實(shí)現(xiàn) 121
7.3 表相關(guān)API 125
7.3.1 Get方法 126
7.3.2 Set方法 129
7.4 表相關(guān)指令 131
7.4.1 NEWTABLE 131
7.4.2 GETTABLE 133
7.4.3 SETTABLE 135
7.4.4 SETLIST 136
7.5 測(cè)試本章代碼 138
7.6 本章小結(jié) 140
第8章 函數(shù)調(diào)用 141
8.1 函數(shù)調(diào)用介紹 141
8.2 函數(shù)調(diào)用棧 143
8.2.1 調(diào)用幀實(shí)現(xiàn) 144
8.2.2 調(diào)用棧實(shí)現(xiàn) 145
8.3 函數(shù)調(diào)用API 147
8.3.1 Load() 148
8.3.2 Call() 149
8.4 函數(shù)調(diào)用指令 152
8.4.1 CLOSURE 152
8.4.2 CALL 153
8.4.3 RETURN 157
8.4.4 VARARG 158
8.4.5 TAILCALL 159
8.4.6 SELF 160
8.4.7 擴(kuò)展LuaVM接口 162
8.4.8 改進(jìn)SETLIST指令 163
8.5 測(cè)試本章代碼 164
8.6 本章小結(jié) 166
第9章 Go函數(shù)調(diào)用 167
9.1 Go函數(shù)登場(chǎng) 167
9.1.1 添加Go函數(shù)類型 168
9.1.2 擴(kuò)展Lua API 169
9.1.3 調(diào)用Go函數(shù) 170
9.2 Lua注冊(cè)表 172
9.2.1 添加注冊(cè)表 172
9.2.2 操作注冊(cè)表 173
9.3 全局環(huán)境 175
9.3.1 使用API操作全局環(huán)境 175
9.3.2 在Lua里訪問全局環(huán)境 178
9.4 測(cè)試本章代碼 179
9.5 本章小結(jié) 181
第10章 閉包和Upvalue 183
10.1 閉包和Upvalue介紹 183
10.1.1 背景知識(shí) 183
10.1.2 Upvalue介紹 185
10.1.3 全局變量 187
10.2 Upvalue底層支持 189
10.2.1 修改closure結(jié)構(gòu)體 189
10.2.2 Lua閉包支持 191
10.2.3 Go閉包支持 192
10.3 Upvalue相關(guān)指令 195
10.3.1 GETUPVAL 195
10.3.2 SETUPVAL 196
10.3.3 GETTABUP 197
10.3.4 SETTABUP 199
10.3.5 JMP 200
10.4 測(cè)試本章代碼 202
10.5 本章小結(jié) 203
第11章 元編程 205
11.1 元表和元方法介紹 205
11.1.1 元表 206
11.1.2 元方法 206
11.2 支持元表 207
11.3 調(diào)用元方法 208
11.3.1 算術(shù)元方法 209
11.3.2 長(zhǎng)度元方法 211
11.3.3 拼接元方法 211
11.3.4 比較元方法 212
11.3.5 索引元方法 214
11.3.6 函數(shù)調(diào)用元方法 216
11.4 擴(kuò)展Lua API 217
11.4.1 GetMetatable() 218
11.4.2 SetMetatable() 218
11.5 測(cè)試本章代碼 219
11.6 本章小結(jié) 222
第12章 迭代器 223
12.1 迭代器介紹 223
12.2 next()函數(shù) 226
12.2.1 修改luaTable結(jié)構(gòu)體 227
12.2.2 擴(kuò)展Lua API 228
12.2.3 實(shí)現(xiàn)next()函數(shù) 229
12.3 通用for循環(huán)指令 229
12.4 測(cè)試本章代碼 232
12.5 本章小結(jié) 234
第13章 異常和錯(cuò)誤處理 235
13.1 異常和錯(cuò)誤處理介紹 235
13.2 異常和錯(cuò)誤處理API 237
13.2.1 Error() 238
13.2.2 PCall() 239
13.3 error()和pcall()函數(shù) 240
13.4 測(cè)試本章代碼 241
13.5 本章小結(jié) 242
第三部分 Lua語法和編譯器
第14章 詞法分析 245
14.1 編譯器介紹 245
14.2 Lua詞法介紹 247
14.3 實(shí)現(xiàn)詞法分析器 251
14.3.1 定義Token類型 252
14.3.2 空白字符 254
14.3.3 注釋 256
14.3.4 分隔符和運(yùn)算符 256
14.3.5 長(zhǎng)字符串字面量 258
14.3.6 短字符串字面量 259
14.3.7 數(shù)字字面量 262
14.3.8 標(biāo)識(shí)符和關(guān)鍵字 263
14.4 LookAhead()和其他方法 264
14.5 測(cè)試本章代碼 265
14.6 本章小結(jié) 267
第15章 抽象語法樹 269
15.1 抽象語法樹介紹 269
15.2 Chunk和塊 270
15.3 語句 272
15.3.1 簡(jiǎn)單語句 273
15.3.2 while和repeat語句 273
15.3.3 if語句 274
15.3.4 數(shù)值for循環(huán)語句 275
15.3.5 通用for循環(huán)語句 275
15.3.6 局部變量聲明語句 276
15.3.7 賦值語句 277
15.3.8 非局部函數(shù)定義語句 278
15.3.9 局部函數(shù)定義語句 279
15.4 表達(dá)式 280
15.4.1 簡(jiǎn)單表達(dá)式 280
15.4.2 運(yùn)算符表達(dá)式 281
15.4.3 表構(gòu)造表達(dá)式 281
15.4.4 函數(shù)定義表達(dá)式 282
15.4.5 前綴表達(dá)式 283
15.4.6 圓括號(hào)表達(dá)式 284
15.4.7 表訪問表達(dá)式 284
15.4.8 函數(shù)調(diào)用表達(dá)式 285
15.5 本章小結(jié) 286
第16章 語法分析 287
16.1 語法分析介紹 287
16.1.1 歧義 288
16.1.2 前瞻和回溯 289
16.1.3 解析方式 290
16.2 解析塊 290
16.3 解析語句 293
16.3.1 簡(jiǎn)單語句 294
16.3.2 if語句 296
16.3.3 for循環(huán)語句 297
16.3.4 局部變量聲明和函數(shù)定義語句 299
16.3.5 賦值和函數(shù)調(diào)用語句 300
16.3.6 非局部函數(shù)定義語句 302
16.4 解析表達(dá)式 303
16.4.1 運(yùn)算符表達(dá)式 304
16.4.2 非運(yùn)算符表達(dá)式 306
16.4.3 函數(shù)定義表達(dá)式 307
16.4.4 表構(gòu)造表達(dá)式 308
16.4.5 前綴表達(dá)式 310
16.4.6 圓括號(hào)表達(dá)式 311
16.4.7 函數(shù)調(diào)用表達(dá)式 312
16.4.8 表達(dá)式優(yōu)化 313
16.5 測(cè)試本章代碼 315
16.6 本章小結(jié) 316
第17章 代碼生成 317
17.1 定義funcInfo結(jié)構(gòu)體 317
17.1.1 常量表 318
17.1.2 寄存器分配 319
17.1.3 局部變量表 320
17.1.4 Break表 323
17.1.5 Upvalue表 324
17.1.6 字節(jié)碼 325
17.1.7 其他信息 327
17.2 編譯塊 327
17.3 編譯語句 329
17.3.1 簡(jiǎn)單語句 330
17.3.2 while和repeat語句 331
17.3.3 if語句 333
17.3.4 for循環(huán)語句 334
17.3.5 局部變量聲明語句 335
17.3.6 賦值語句 337
17.4 編譯表達(dá)式 339
17.4.1 函數(shù)定義表達(dá)式 340
17.4.2 表構(gòu)造表達(dá)式 341
17.4.3 運(yùn)算符表達(dá)式 343
17.4.4 名字和表訪問表達(dá)式 345
17.4.5 函數(shù)調(diào)用表達(dá)式 346
17.5 生成函數(shù)原型 347
17.6 使用編譯器 349
17.7 測(cè)試本章代碼 350
17.8 本章小結(jié) 350
第四部分 Lua標(biāo)準(zhǔn)庫
第18章 輔助API和基礎(chǔ)庫 353
18.1 Lua標(biāo)準(zhǔn)庫介紹 353
18.2 輔助API 355
18.2.1 增強(qiáng)版方法 357
18.2.2 加載方法 358
18.2.3 參數(shù)檢查方法 359
18.2.4 標(biāo)準(zhǔn)庫開啟方法 360
18.3 基礎(chǔ)庫 361
18.3.1 基礎(chǔ)庫介紹 362
18.3.2 基礎(chǔ)庫實(shí)現(xiàn) 362
18.4 測(cè)試本章代碼 365
18.5 本章小結(jié) 366
第19章 工具庫 367
19.1 數(shù)學(xué)庫 367
19.2 表庫 369
19.3 字符串庫 372
19.4 UTF-8庫 374
19.5 OS庫 376
19.6 本章小結(jié) 379
第20章 包和模塊 381
20.1 包和模塊介紹 381
20.2 實(shí)現(xiàn)包庫 386
20.3 測(cè)試本章代碼 391
20.4 本章小結(jié) 392
第21章 協(xié)程 393
21.1 協(xié)程介紹 393
21.2 協(xié)程API 396
21.2.1 支持線程類型 396
21.2.2 支持協(xié)程操作 398
21.3 實(shí)現(xiàn)協(xié)程庫 400
21.4 測(cè)試本章代碼 403
21.5 本章小結(jié) 404
附錄A Lua虛擬機(jī)指令集 405
附錄B Lua語法EBNF描述 407
后記 409