自己動手實現 Lua:虛擬機、編譯器和標準庫 自己动手实现Lua:虚拟机、编译器和标准库 Lua、脚本语言、游戏开发、Go、Go语言、标准库、虚拟机、编译原理、编译器

張秀宏

  • 出版商: 機械工業
  • 出版日期: 2018-01-01
  • 售價: $534
  • 貴賓價: 9.5$507
  • 語言: 簡體中文
  • 裝訂: 平裝-文庫
  • ISBN: 7111610229
  • ISBN-13: 9787111610229
  • 相關分類: Compiler
  • 立即出貨

買這商品的人也買了...

商品描述

本書是一本面向Lua程序員和腳本語言愛好者的語言自製指南和實戰寶典。作者融合自己豐富的工程實踐經驗,詳細闡述Lua語言的核心語法和實現原理,深入探討Lua虛擬機、編譯器和標準庫,並給出了實際可以編譯執行的代碼。助你從零基礎開始編程實現Lua語言,徹底理解腳本語言工作原理。全書分為3個部分,共21章。第一部分主要討論LuaAPI和虛擬機實現,包括二進制chunk格式、Lua虛擬機指令集、元編程、錯誤處理等。第二部分主要討論Lua語法和編譯器實現,包括詞法分析、語法分析、代碼優化、代碼生成等。第三部分主要討論Lua輔助API和標準庫實現,包括基礎庫、實用工具庫、包和模塊、協程等。

作者簡介

張秀宏
服務器開發工程師,有多年的Java和遊戲服務器開發和架構經驗,對高級語言虛擬機有非常深入的研究。曾在EA、樂元素等遊戲公司擔任高級服務器工程師,現任某創業公司架構師。
曾於2016年6月出版《自己動手寫Java虛擬機》一書,廣受讀者好評,並多次重印。《自己動手實現Lua:虛擬機、編譯器、標準庫》是他時隔兩年之後推出的又一力作。

目錄大綱

前言
第一部分準備
第1章準備工作3 
1.1準備開發環境3 
1.1.1操作系統3 
1.1.2安裝Lua 4 
1.1.3安裝Go 4 
1.2準備目錄結構4 
1.3本章小結6 

第二部分Lua虛擬機和Lua API 
第2章二進制chunk 9 
2.1什麼是二進制chunk 10 
2.2 luac命令介紹11 
2.2.1編譯Lua源文件11 
2.2.2查看二進制chunk 13 
2.3二進制chunk格式15 
2.3.1數據類型16 
2.3.2總體結構17 
2.3.3頭部18 
2.3.4函數原型22 
2.4解析二進制chunk 27 
2.4.1讀取基本數據類型28 
2.4.2檢查頭部29 
2.4.3讀取函數原型30 
2.5測試本章代碼33 
2.6本章小結36 

第3章指令集37 
3.1指令集介紹37 
3.2指令編碼格式38 
3.2.1編碼模式38
3.2.2操作碼39 
3.2.3操作數40 
3.2.4指令表41 
3.3指令解碼42 
3.4測試本章代碼44 
3.5本章小結47 

第4章Lua API 49 
4.1 Lua API介紹49 
4.2 Lua棧51 
4.2.1 Lua數據類型和值51 
4.2.2棧索引54 
4.2.3定義luaStack結構體54 
4.3 Lua State 57 
4.3.1定義LuaState接口57 
4.3.2定義luaState結構體58 
4.3.3基礎棧操縱方法59 
4.3.4 Push方法64 
4.3.5 Access方法65 
4.4測試本章代碼69 
4.5本章小結70 

第5章Lua運算符71 
5.1 Lua運算符介紹71 
5.2自動類型轉換75 
5.3擴展LuaState接口79 
5.3.1 Arith()方法80 
5.3. 2 Compare()方法83 
5.3.3 Len()方法85 
5.3.4 Concat()方法86 
5.4測試本章代碼87
5.5本章小結88 

第6章虛擬機雛形89 
6.1添加LuaVM接口89 
6.1.1定義LuaVM接口91 
6.1.2改造luaState結構體92 
6.1.3實現LuaVM接口93 
6.2實現Lua虛擬機指令94 
6.2.1移動和跳轉指令94 
6.2.2加載指令96 
6.2.3算術運算指令101 
6.2.4長度和拼接指令103 
6.2.5比較指令106 
6.2.6邏輯運算指令107 
6.2.7 for循環指令110 
6.3指令分派113 
6.4測試本章代碼115 
6.5本章小結118 

第7章表119 
7.1表介紹119 
7.2表內部實現121 
7.3表相關API 125 
7.3.1 Get方法126 
7.3.2 Set方法129 
7.4表相關指令131 
7.4.1 NEWTABLE 131 
7.4 .2 GETTABLE 133 
7.4.3 SETTABLE 135 
7.4.4 SETLIST 136 
7.5測試本章代碼138
7.6本章小結140 

第8章函數調用141 
8.1函數調用介紹141 
8.2函數調用棧143 
8.2.1調用幀實現144 
8.2.2調用棧實現145 
8.3函數調用API 147 
8.3.1 Load() 148 
8.3.2 Call () 149 
8.4函數調用指令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擴展LuaVM接口162 
8.4.8改進SETLIST指令163 
8.5測試本章代碼164 
8.6本章小結166 

第9章Go函數調用167 
9.1 Go函數登場167 
9.1.1添加Go函數類型168 
9.1.2擴展Lua API 169 
9.1.3調用Go函數170 
9.2 Lua註冊表172 
9.2.1添加註冊表172 
9.2.2操作註冊表173 
9.3全局環境175
9.3.1使用API操作全局環境175 
9.3.2在Lua裡訪問全局環境178 
9.4測試本章代碼179 
9.5本章小結181 

第10章閉包和Upvalue 183 
10.1閉包和Upvalue介紹183 
10.1.1背景知識183 
10.1 .2 Upvalue介紹185 
10.1.3全局變量187 
10.2 Upvalue底層支持189 
10.2.1修改closure結構體189 
10.2.2 Lua閉包支持191 
10.2.3 Go閉包支持192 
10.3 Upvalue相關指令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測試本章代碼202 
10.5本章小結203 

第11章元編程205 
11.1元表和元方法介紹205 
11.1.1元表206 
11.1 .2元方法206 
11.2支持元表207 
11.3調用元方法208
11.3.1算術元方法209 
11.3.2長度元方法211 
11.3.3拼接元方法211 
11.3.4比較元方法212 
11.3.5索引元方法214 
11.3.6函數調用元方法216 
11.4擴展Lua API 217 
11.4. 1 GetMetatable() 218 
11.4.2 SetMetatable() 218 
11.5測試本章代碼219 
11.6本章小結222 

第12章迭代器223 
12.1迭代器介紹223 
12.2 next()函數226 
12.2.1修改luaTable結構體227 
12.2.2擴展Lua API 228 
12.2.3實現next()函數229 
12.3通用for循環指令229 
12.4測試本章代碼232 
12.5本章小結234 

第13章異常和錯誤處理235 
13.1異常和錯誤處理介紹235 
13.2異常和錯誤處理API 237 
13.2 .1 Error() 238 
13.2.2 PCall() 239 
13.3 error()和pcall()函數240 
13.4測試本章代碼241
13.5本章小結242 

第三部分Lua語法和編譯器
第14章詞法分析245 
14.1編譯器介紹245 
14.2 Lua詞法介紹247 
14.3實現詞法分析器251 
14.3.1定義Token類型252 
14.3.2空白字符254 
14.3.3註釋256 
14.3.4分隔符和運算符256 
14.3.5長字符串字面量258 
14.3.6短字符串字面量259 
14.3.7數字字面量262 
14.3.8標識符和關鍵字263 
14.4 LookAhead()和其他方法264 
14.5測試本章代碼265 
14.6本章小結267 

第15章抽象語法樹269 
15.1抽象語法樹介紹269 
15.2 Chunk和塊270 
15.3語句272 
15.3.1簡單語句273 
15.3.2 while和repeat語句273 
15.3.3 if語句274 
15.3.4數值for循環語句275 
15.3.5通用for循環語句275 
15.3.6局部變量聲明語句276 
15.3.7賦值語句277
15.3.8非局部函數定義語句278 
15.3.9局部函數定義語句279 
15.4表達式280 
15.4.1簡單表達式280 
15.4.2運算符表達式281 
15.4.3表構造表達式281 
15.4.4函數定義表達式282 
15.4.5前綴表達式283 
15.4.6圓括號表達式284 
15.4.7表訪問表達式284 
15.4.8函數調用表達式285 
15.5本章小結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簡單語句294 
16.3.2 if語句296 
16.3.3 for循環語句297 
16.3.4局部變量聲明和函數定義語句299 
16.3.5賦值和函數調用語句300 
16.3.6非局部函數定義語句302 
16.4解析表達式303 
16.4.1運算符表達式304 
16.4.2非運算符表達式306
16.4.3函數定義表達式307 
16.4.4表構造表達式308 
16.4.5前綴表達式310 
16.4.6圓括號表達式311 
16.4.7函數調用表達式312 
16.4.8表達式優化313 
16.5測試本章代碼315 
16.6本章小結316 

第17章代碼生成317 
17.1定義funcInfo結構體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字節碼325 
17.1.7其他信息327 
17.2編譯塊327 
17.3編譯語句329 
17.3.1簡單語句330 
17.3.2 while和repeat語句331 
17.3.3 if語句333 
17.3.4 for循環語句334 
17.3.5局部變量聲明語句335 
17.3.6賦值語句337 
17.4編譯表達式339 
17.4.1函數定義表達式340 
17.4.2表構造表達式341
17.4.3運算符表達式343 
17.4.4名字和表訪問表達式345 
17.4.5函數調用表達式346 
17.5生成函數原型347 
17.6使用編譯器349 
17.7測試本章代碼350 
17.8本章小結350 

第四部分Lua標準庫
第18章輔助API和基礎庫353 
18.1 Lua標準庫介紹353 
18.2輔助API 355 
18.2.1增強版方法357 
18.2.2加載方法358 
18.2.3參數檢查方法359 
18.2.4標準庫開啟方法360 
18.3基礎庫361 
18.3.1基礎庫介紹362 
18.3.2基礎庫實現362 
18.4測試本章代碼365 
18.5本章小結366 

第19章工具庫367 
19.1數學庫367 
19.2表庫369 
19.3字符串庫372 
19.4 UTF-8庫374 
19.5 OS庫376 
19.6本章小結379 

第20章包和模塊381 
20.1包和模塊介紹381 
20.2實現包庫386
20.3測試本章代碼391 
20.4本章小結392 

第21章協程393 
21.1協程介紹393 
21.2協程API 396 
21.2.1支持線程類型396 
21.2.2支持協程操作398 
21.3實現協程庫400 
21.4測試本章代碼403 
21.5本章小結404 
附錄A Lua虛擬機指令集405 
附錄B Lua語法EBNF描述407 
後記409