面向WebAssembly編程:應(yīng)用開發(fā)方法與實(shí)踐
定 價(jià):79 元
- 作者:丁爾男 柴樹杉
- 出版時(shí)間:2020/12/1
- ISBN:9787111669241
- 出 版 社:機(jī)械工業(yè)出版社
- 中圖法分類:TP314
- 頁碼:0
- 紙張:
- 版次:
- 開本:16開
內(nèi)容簡介
這是一部講解如何用高級編程語言開發(fā)WebAssembly應(yīng)用的著作,由國內(nèi)WebAssembly領(lǐng)域的先驅(qū)者和布道者撰寫。
全書一共10章,分為三個(gè)部分。
第壹部分 基礎(chǔ)篇(第1~3章)
首先介紹了WebAssembly的基礎(chǔ)和工具鏈Emscripten的用法,然后詳細(xì)講解了使用 C/C++語言和Emscripten開發(fā)WebAssembly模塊的方法。
第二部分 方法篇(第4~8章)
對 Emscripten 運(yùn)行時(shí)、WebAssembly 友好的一般性方法、網(wǎng)絡(luò) I/O、并發(fā)執(zhí)行、GUI 及交互等知識點(diǎn)展開了深入的討論。
第三部分 前沿篇(第9~10章)
詳細(xì)講解了WASI以及如何使用 Rust 語言開發(fā) WebAssembly模塊和 WASI 應(yīng)用。
前言
第一篇 基礎(chǔ)篇
第1章 認(rèn)識WebAssembly2
1.1 WebAssembly的誕生背景2
1.2 Web的第4種語言3
1.3 本章小結(jié)4
第2章 Emscripten快速入門5
2.1 安裝Emscripten5
2.1.1 使用emsdk命令行工具安裝Emscripten5
2.1.2 在Docker環(huán)境中安裝Emscripten7
2.1.3 校驗(yàn)安裝8
2.2 你好,世界!8
2.2.1 生成.wasm文件8
2.2.2 運(yùn)行9
2.2.3 使用Emscripten生成測試頁面11
2.3 膠水代碼初探12
2.3.1 WebAssembly匯編模塊載入12
2.3.2 導(dǎo)出函數(shù)封裝14
2.3.3 異步加載16
2.4 編譯目標(biāo)及編譯流程17
2.4.1 編譯目標(biāo)的選擇17
2.4.2 編譯流程18
2.5 示例:放大鏡特效19
2.5.1 模板程序19
2.5.2 靜態(tài)的放大鏡20
2.5.3 動態(tài)的放大鏡21
2.6 本章小結(jié)24
第3章 C與JavaScript互操作25
3.1 JavaScript調(diào)用C函數(shù)25
3.1.1 定義函數(shù)導(dǎo)出宏25
3.1.2 在JavaScript中調(diào)用C導(dǎo)出函數(shù)27
3.2 JavaScript函數(shù)注入C環(huán)境30
3.2.1 C函數(shù)聲明30
3.2.2 JavaScript實(shí)現(xiàn)C函數(shù)30
3.2.3 閉包限制及解決辦法32
3.2.4 JavaScript函數(shù)注入C環(huán)境的優(yōu)缺點(diǎn)33
3.3 單向透明的內(nèi)存模型33
3.3.1 Module.buffer34
3.3.2 Module.HEAPX34
3.3.3 在JavaScript中訪問C/C++環(huán)境內(nèi)存35
3.4 JavaScript與C/C++交換數(shù)據(jù)37
3.4.1 參數(shù)及返回值37
3.4.2 通過內(nèi)存交換數(shù)據(jù)39
3.4.3 在JavaScript中分配內(nèi)存42
3.4.4 字符串43
3.5 EM_ASM系列宏44
3.5.1 EM_ASM44
3.5.2 EM_ASM_/EM_ASM_DOUBLE45
3.5.3 EM_ASM_INT_V/EM_ASM_DOUBLE_V46
3.6 emscripten_run_script()系列函數(shù)47
3.6.1 emscripten_run_script()47
3.6.2 emscripten_run_script_int()48
3.6.3 emscripten_run_script_string()49
3.7 ccall()/cwrap()50
3.7.1 ccall()51
3.7.2 cwrap()53
3.7.3 ccall()/cwrap()的潛在風(fēng)險(xiǎn)53
3.8 本章小結(jié)56
第二篇 方法篇
第4章 Emscripten運(yùn)行時(shí)58
4.1 main()函數(shù)與生命周期58
4.2 消息循環(huán)61
4.2.1 emscripten_set_main_loop()61
4.2.2 消息循環(huán)的暫停、繼續(xù)及終止63
4.3 文件系統(tǒng)65
4.3.1 Emscripten虛擬文件系統(tǒng)架構(gòu)66
4.3.2 基于MEMFS的打包文件系統(tǒng)67
4.3.3 NODEFS文件系統(tǒng)71
4.3.4 IDBFS72
4.4 內(nèi)存管理73
4.4.1 內(nèi)存容量/棧容量73
4.4.2 可變內(nèi)存74
4.4.3 內(nèi)存分配器75
4.5 Module定制75
4.6 示例:人臉檢測78
4.6.1 facedetect_cnn()函數(shù)78
4.6.2 facedetect_cnn()函數(shù)再封裝79
4.6.3 讀取圖像并檢測人臉81
4.6.4 基于SDL顯示IplImage圖像82
4.7 本章小結(jié)84
第5章 WebAssembly友好的一般性方法85
5.1 消息循環(huán)分離85
5.1.1 emscripten_set_main_loop()的不足85
5.1.2 在JavaScript中創(chuàng)建定時(shí)循環(huán)86
5.2 內(nèi)存對齊88
5.2.1 asm.js88
5.2.2 wasm91
5.2.3 避免及檢測未對齊的內(nèi)存操作92
5.3 使用C接口導(dǎo)出C++對象93
5.4 C++對象生命周期管理97
5.4.1 引用計(jì)數(shù)97
5.4.2 AddRef()/Release()使用規(guī)則98
5.4.3 導(dǎo)出AddRef()/Release()100
5.5 使用C接口注入JavaScript對象103
5.5.1 創(chuàng)建JavaScript對象/ID表103
5.5.2 注入JavaScript對象的生命周期管理104
5.6 小心64位整型數(shù)107
5.6.1 WebAssembly原生支持int64108
5.6.2 導(dǎo)出函數(shù)包含int64108
5.6.3 注入函數(shù)包含int64110
5.7 文件系統(tǒng)的缺陷111
5.8 本章小結(jié)112
第6章 網(wǎng)絡(luò)I/O113
6.1 XMLHttpRequest113
6.1.1 XMLHttpRequest對象使用簡介113
6.1.2 XMLHttpRequest對象的C接口封裝115
6.1.3 擴(kuò)展回調(diào)處理116
6.2 WebSocket119
6.2.1 創(chuàng)建WebSocket測試服務(wù)120
6.2.2 在JavaScript中使用WebSocket121
6.2.3 WebSocket對象的C接口封裝122
6.3 本章小結(jié)126
第7章 并發(fā)執(zhí)行127
7.1 JavaScript中的并發(fā)模型127
7.2 在Worker中使用Emscripten129
7.3 pthread線程132
7.3.1 原子操作132
7.3.2 pthread示例134
7.3.3 在瀏覽器環(huán)境運(yùn)行pthread示例136
7.4 本章小結(jié)137
第8章 GUI及交互138
8.1 Canvas138
8.2 鼠標(biāo)事件141
8.3 鍵盤事件144
8.4 Life游戲145
8.4.1 Life簡介146
8.4.2 設(shè)計(jì)要求146
8.4.3 Life游戲C代碼146
8.4.4 Life游戲網(wǎng)頁代碼150
8.4.5 運(yùn)行Life151
8.5 本章小結(jié)152
第三篇 前沿篇
第9章 Rust和WebAssembly154
9.1 Rust入門154
9.1.1 安裝Rust開發(fā)環(huán)境154
9.1.2 你好,世界155
9.1.3 Cargo管理工程155
9.1.4 本地文檔156
9.2 你好,WebAssembly157
9.2.1 安裝WebAssembly開發(fā)環(huán)境157
9.2.2 打印“你好,WebAssembly”159
9.3 導(dǎo)入和導(dǎo)出函數(shù)159
9.3.1 導(dǎo)出main()函數(shù)159
9.3.2 導(dǎo)入宿主打印函數(shù)161
9.3.3 導(dǎo)出自定義函數(shù)162
9.4 打印命令行參數(shù)163
9.4.1 打印字符串163
9.4.2 準(zhǔn)備導(dǎo)入env_print_str()函數(shù)164
9.4.3 向Rust傳入字符串165
9.4.4 命令行參數(shù)封裝168
9.4.5 傳入命令行參數(shù)170
9.5 no_std171
9.5.1 輸出文件的大小171
9.5.2 通過no_std裁剪標(biāo)準(zhǔn)172
9.5.3 庫173
9.6 嵌入C代碼174
9.6.1 C語言思維174
9.6.2 連接C語言庫175
9.6.3 集成C語言源碼175
9.6.4 build.rs自動構(gòu)建178
9.7 本章小結(jié)181
第10章 WASI系統(tǒng)接口182
10.1 WASI簡介182
10.2 探秘WASI工作原理183
10.2.1 準(zhǔn)備工作183
10.2.2 探秘wasm32-wasi底層184
10.2.3 Rust和wasm32-unknown-unknown185
10.2.4 C/C++編譯成WASI程序187
10.2.5 匯編程序189
10.3 WebAssembly虛擬機(jī)191
10.3.1 準(zhǔn)備WebAssembly測試模塊191
10.3.2 Node.js環(huán)境:基于wasi包191
10.3.3 Node.js環(huán)境:手工實(shí)現(xiàn)fd_write()函數(shù)192
10.3.4 Rust環(huán)境:導(dǎo)入wasi包193
10.3.5 Rust環(huán)境:手工實(shí)現(xiàn)fd_write()函數(shù)195
10.4 wapm包管理器196
10.4.1 安裝wapm包管理器196
10.4.2 安裝并運(yùn)行cowsay小程序197
10.4.3 創(chuàng)建wapm模塊198
10.5 本章小結(jié)200
附錄
附錄A WebAssembly接口202
附錄B 機(jī)器指令211