內(nèi)容簡介
WebAssembly是棧式虛擬機和字節(jié)碼技術(shù)的*新應用,在Web開發(fā)、后端開發(fā)、區(qū)塊鏈等領域大顯身手,越來越受歡迎。
本書是WebAssembly入門和進階的必讀書,它不僅對WebAssembly的工作原理、核心技術(shù)和規(guī)范進行了全面的剖析和解讀,而且給出了實現(xiàn)WebAssembly解釋器和AOT編譯器的思路和代碼。
本書共14章,分為四個部分:
第壹部分 WebAssembly概述(第1章)
主要介紹了WebAssembly的概念、發(fā)展歷史以及閱讀本書需要做的準備工作。
第二部分 二進制和文本格式(第2~4章)
詳細講解了WebAssembly的二進制格式、文本格式以及指令集。
第三部分 虛擬機和解釋器(第5~11章)
詳細講解了WebAssembly的解釋器和虛擬機的工作原理以及實現(xiàn)思路,包括操作數(shù)棧、內(nèi)存、函數(shù)調(diào)用、控制指令、鏈接和實例化、錯誤處理和驗證等。
第四部分 WebAssembly進階(第12~14章)
深入地講解了AOT編譯器的實現(xiàn)思路和WebAssembly的提案等內(nèi)容。
通過閱讀本書,讀者不僅可以理解WebAssembly核心原理,還可以學習如何實現(xiàn)WebAssembly解釋器和AOT編譯器。即收獲了“魚”,又學會了“漁”。
前言
第一部分 概述
第1章 Wasm介紹3
1.1 Wasm簡史3
1.2 Wasm簡介6
1.3 準備工作10
1.4 你好Wasm11
1.5 本章小結(jié)13
第二部分 二進制和文本格式
第2章 二進制格式17
2.1 二進制格式介紹17
2.1.1 Wasm二進制格式總體結(jié)構(gòu)18
2.1.2 索引空間21
2.1.3 實體類型23
2.2 二進制格式分析25
2.2.0 魔數(shù)和版本號25
2.2.1 類型段26
2.2.2 導入段28
2.2.3 函數(shù)段30
2.2.4 表段30
2.2.5 內(nèi)存段31
2.2.6 全局段32
2.2.7 導出段33
2.2.8 起始段34
2.2.9 元素段35
2.2.10 代碼段35
2.2.11 數(shù)據(jù)段37
2.2.12 自定義段38
2.3 二進制格式解碼39
2.3.1 LEB128介紹39
2.3.2 解碼基本類型41
2.3.3 解碼向量類型44
2.3.4 處理tag44
2.3.5 解碼代碼項和表達式45
2.3.6 解碼整體結(jié)構(gòu)45
2.3.7 處理錯誤情況47
2.4 實現(xiàn)dump命令48
2.5 本章小結(jié)50
第3章 指令集51
3.1 指令集介紹51
3.1.1 操作碼51
3.1.2 助記符53
3.1.3 立即數(shù)54
3.1.4 操作數(shù)57
3.2 指令分析58
3.2.1 數(shù)值指令58
3.2.2 變量指令60
3.2.3 內(nèi)存指令61
3.2.4 結(jié)構(gòu)化控制指令62
3.2.5 跳轉(zhuǎn)指令64
3.2.6 函數(shù)調(diào)用指令65
3.3 指令解碼66
3.4 完善dump命令69
3.5 本章小結(jié)70
第4章 文本格式71
4.1 基本結(jié)構(gòu)71
4.1.1 類型域72
4.1.2 導入和導出域73
4.1.3 函數(shù)域75
4.1.4 表域和元素域75
4.1.5 內(nèi)存域和數(shù)據(jù)域76
4.1.6 全局域77
4.1.7 起始域77
4.2 指令78
4.2.1 普通形式78
4.2.2 折疊形式79
4.3 本章小結(jié)81
第三部分 虛擬機和解釋器
第5章 操作數(shù)棧85
5.1 操作數(shù)棧85
5.2 虛擬機87
5.2.1 指令循環(huán)88
5.2.2 指令分派88
5.3 參數(shù)指令89
5.3.1 drop指令90
5.3.2 select指令90
5.4 數(shù)值指令91
5.4.1 常量指令92
5.4.2 測試指令92
5.4.3 比較指令93
5.4.4 一元算術(shù)指令95
5.4.5 二元算術(shù)指令96
5.4.6 類型轉(zhuǎn)換指令99
5.5 本章效果103
5.6 本章小結(jié)105
第6章 內(nèi)存107
6.1 內(nèi)存介紹107
6.2 內(nèi)存實現(xiàn)108
6.3 內(nèi)存指令109
6.3.1 size和grow指令110
6.3.2 加載指令111
6.3.3 存儲指令113
6.4 本章效果115
6.5 本章小結(jié)117
第7章 函數(shù)調(diào)用(上)119
7.1 函數(shù)調(diào)用介紹119
7.2 函數(shù)調(diào)用實現(xiàn)122
7.2.1 增強操作數(shù)棧123
7.2.2 添加調(diào)用棧124
7.2.3 增強虛擬機126
7.2.4 call指令127
7.3 局部變量指令129
7.3.1 local.get指令130
7.3.2 local.set指令130
7.3.3 local.tee指令131
7.4 全局變量指令132
7.4.1 global.get指令132
7.4.2 global.set指令133
7.5 本章效果134
7.6 本章小結(jié)135
第8章 控制指令137
8.1 控制指令介紹137
8.1.1 跳轉(zhuǎn)標簽138
8.1.2 跳轉(zhuǎn)標簽索引139
8.1.3 塊類型141
8.2 控制指令實現(xiàn)142
8.2.1 block和loop指令142
8.2.2 if指令144
8.2.3 br指令146
8.2.4 br_if指令148
8.2.5 br_table指令149
8.2.6 return指令150
8.2.7 unreachable和nop指令151
8.3 本章效果152
8.4 本章小結(jié)153
第9章 函數(shù)調(diào)用(下)155
9.1 本地函數(shù)調(diào)用155
9.1.1 本地函數(shù)介紹155
9.1.2 統(tǒng)一兩種函數(shù)158
9.1.3 調(diào)用本地函數(shù)159
9.1.4 鏈接本地函數(shù)161
9.1.5 測試本節(jié)代碼162
9.2 間接函數(shù)調(diào)用163
9.2.1 間接函數(shù)調(diào)用介紹163
9.2.2 實現(xiàn)表165
9.2.3 初始化表166
9.2.4 call_indirect指令167
9.2.5 測試本節(jié)代碼168
9.3 本章小結(jié)169
第10章 鏈接和實例化171
10.1 定義實例接口171
10.2 實現(xiàn)實例接口174
10.2.1 函數(shù)174
10.2.2 表176
10.2.3 全局變量177
10.2.4 虛擬機177
10.3 實例化模塊178
10.4 本章效果180
10.5 本章小結(jié)183
第11章 錯誤處理和驗證185
11.1 各種錯誤186
11.1.1 解碼錯誤186
11.1.2 結(jié)構(gòu)錯誤188
11.1.3 實例化錯誤189
11.1.4 運行時錯誤190
11.2 驗證整體結(jié)構(gòu)190
11.3 驗證函數(shù)字節(jié)碼192
11.3.1 數(shù)據(jù)結(jié)構(gòu)193
11.3.2 操作數(shù)棧194
11.3.3 控制棧195
11.3.4 驗證指令197
11.4 本章效果198
11.5 本章小結(jié)199
第四部分 進階
第12章 編譯為Wasm203
12.1 控制指令203
12.2 參數(shù)指令207
12.3 變量指令208
12.4 內(nèi)存指令210
12.5 數(shù)值指令213
12.6 本章小結(jié)215
第13章 AOT編譯器217
13.1 AOT介紹217
13.2 編譯模塊219
13.3 編譯函數(shù)220
13.3.1 內(nèi)部函數(shù)221
13.3.2 外部函數(shù)222
13.3.3 導出函數(shù)222
13.3.4 輔助方法223
13.4 編譯指令224
13.4.1 參數(shù)指令224
13.4.2 變量指令225
13.4.3 內(nèi)存指令226
13.4.4 數(shù)值指令227
13.4.5 結(jié)構(gòu)化控制指令228
13.4.6 跳轉(zhuǎn)指令230
13.4.7 函數(shù)調(diào)用指令231
13.5 本章效果233
13.6 本章小結(jié)234
第14章 提案和前景235
14.1 提案235
14.1.1 多塊內(nèi)存237
14.1.2 內(nèi)存塊操作237
14.1.3 引用類型239
14.1.4 尾遞歸調(diào)用241
14.1.5 異常處理242
14.1.6 多線程支持244
14.1.7 其他提案247
14.2 前景248
附錄A Wasm指令表249
附錄B 二進制格式253
附錄C WAT語法255