-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
3/26 新書到! 3/19 新書到! 3/14 新書到! 12/12 新書到!
購書流程Q & A站務留言版客服信箱
3ds MaxMayaRhinoAfter EffectsSketchUpZBrushPainterUnity
PhotoShopAutoCadMasterCamSolidWorksCreoUGRevitNuke
C#CC++Java遊戲程式Linux嵌入式PLCFPGAMatlab
駭客資料庫搜索引擎影像處理FluentVR+ARANSYS深度學習
單晶片AVROpenGLArduinoRaspberry Pi電路設計CadenceProtel
HadoopPythonStm32CortexLabview手機程式AndroidiPhone
可查書名,作者,ISBN,3dwoo書號
詳細書籍分類

面向WebAssembly編程:應用開發方法與實踐

( 簡體 字)
作者:丁爾男 柴樹杉類別:1. -> 程式設計 -> 綜合
譯者:
出版社:機械工業出版社面向WebAssembly編程:應用開發方法與實踐 3dWoo書號: 53770
詢問書籍請說出此書號!

缺書
NT售價: 395

出版日:12/1/2020
頁數:225
光碟數:0
站長推薦:
印刷:黑白印刷語系: ( 簡體 版 )
加入購物車 加到我的最愛
(請先登入會員)
ISBN:9787111669241
作者序 | 譯者序 | 前言 | 內容簡介 | 目錄 | 
(簡體書上所述之下載連結耗時費功, 恕不適用在台灣, 若讀者需要請自行嘗試, 恕不保證)
作者序:

譯者序:

前言:

為什么要寫這本書

WebAssembly是新一代Web虛擬機標準,可以讓用各種語言編寫的代碼都能以接近原生的速度在Web中運行。比如,C/C++代碼可以通過Emscripten工具鏈編譯為wasm二進制文件,進而導入網頁中供JavaScript調用。這意味著使用C/C++編寫的程序可以直接在網頁中運行,而Rust語言更是內置了對WebAssembly的支持。

作為一種新興技術,目前WebAssembly的相關技術資料尚不豐富,再加上WebAssembly的開發涉及多種語言和開發環境,導致其工程化門檻較高。作為國內最早的一批WebAssembly開發者,我們非常希望能分享相關知識和方法給讀者。

在2018年,借WebAssembly草案1.0發布的契機,我們出版了《WebAssembly標準入門》一書。但《WebAssembly標準入門》重點討論的是WebAssembly技術本身,花了大量篇幅講述虛擬機的底層結構、匯編語言、模塊的二進制格式等內容,并未過多討論如何使用高級語言開發WebAssembly應用。因此在2018年年底,我們重新思考了如何用Emscripten編寫友好的Web應用這個問題,并形成了本書的前半部分。

2019年年底,機械工業出版社發出約稿,其時WASI技術已經誕生,我們希望能在書中包含WASI以及Rust等新的技術內容,最終打造了本書目前的結構。本書從Emscripten的基本使用開始,介紹了用C/C++開發WebAssembly模塊的方法,并且以作者在實際工程項目中獲取的一手經驗為基礎,提出了一些一般性的設計原則和技術框架,同時討論了如何用Rust語言與C/C++語言混合開發WebAssembly應用。

本書理念

我們認為,一個理想的面向Web的C/C++/Rust工程應該對編譯目標不敏感,它既可以被編譯為本地代碼直接運行,也可以被編譯為WebAssembly在網頁中運行,切換二者只需要更改運行環境,這樣便可充分利用現有IDE環境強大的開發、調試、分析、測試等功能,提高工程質量、降低開發成本。但WebAssembly的運行環境畢竟與本地環境有著巨大的差異,因此為了達到上述理想目標,從整體框架到接口設計甚至到函數間的數據交換層面都必須充分考慮Web環境的特點(或者說限制)。這也正是本書所貫徹的“WebAssembly友好”的內涵所在。

讀者對象

本書可為以下兩類讀者帶來直接收益:

以C/C++/Rust為主力開發語言,并且希望介入前端領域的開發者;

希望借助高性能的C/C++/Rust庫解決前端性能問題的JavaScript開發者。

如何閱讀本書

本書旨在介紹如何使用C/C++/Rust語言開發實用的WebAssembly模塊,要求讀者具備基本的JavaScript和C/C++開發技能。本書主要分為以下三篇。

基礎篇(第1章至第3章):介紹了使用C/C++語言及Emscripten工具鏈開發WebAssembly模塊的基本方法。

方法篇(第4章至第8章):對Emscripten運行時、WebAssembly友好的一般性方法、網絡I/O、并發執行、GUI及交互展開討論。

前沿篇(第9章和第10章):介紹了如何使用Rust語言開發WebAssembly模塊和WASI應用。
內容簡介:

這是一部講解如何用高級編程語言開發WebAssembly應用的著作,由國內WebAssembly領域的先驅者和布道者撰寫。

全書一共10章,分為三篇。

第一篇 基礎篇(第1~3章)

首先介紹了WebAssembly的基礎和工具鏈Emscripten的用法,然后詳細講解了使用 C/C++語言和Emscripten開發WebAssembly模塊的方法。

第二篇 方法篇(第4~8章)

對 Emscripten 運行時、WebAssembly 友好的一般性方法、網絡 I/O、并發執行、GUI 及交互等知識點展開了深入的討論。

第三篇 前沿篇(第9~10章)

詳細講解了WASI以及如何使用 Rust 語言開發 WebAssembly模塊和 WASI 應用。

隨著WebAssembly技術的興起,網頁應用與桌面應用的性能差距正在飛快地縮小,“瀏覽器+頁面”正在以驚人的速度進入音/視頻、CAD/CAM等“操作系統+應用程序”專屬的領域。本書專注于WebAssembly工程應用的開發。通過閱讀本書,你將獲得以下技能。



掌握使用C/C++/Rust等高級語言開發WebAssembly模塊,以及與外部的JavaScript環境交互。

借助高性能的 C/C++/Rust 庫解決前端性能問題。

理解網頁環境的功能限制,以及由此帶來的在高級語言環境中應遵循的一般性原則。

掌握DOM元素、網絡I/O、網頁并發執行在WebAssembly模塊中的使用方法。
目錄:

第一篇 基礎篇
第1章 認識WebAssembly2
1.1 WebAssembly的誕生背景2
1.2 Web的第4種語言3
1.3 本章小結4
第2章 Emscripten快速入門5
2.1 安裝Emscripten5
2.1.1 使用emsdk命令行工具安裝Emscripten5
2.1.2 在Docker環境中安裝Emscripten7
2.1.3 校驗安裝8
2.2 你好,世界!8
2.2.1 生成.wasm文件8
2.2.2 運行9
2.2.3 使用Emscripten生成測試頁面11
2.3 膠水代碼初探12
2.3.1 WebAssembly匯編模塊載入12
2.3.2 導出函數封裝14
2.3.3 異步加載16
2.4 編譯目標及編譯流程17
2.4.1 編譯目標的選擇17
2.4.2 編譯流程18
2.5 示例:放大鏡特效19
2.5.1 模板程序19
2.5.2 靜態的放大鏡20
2.5.3 動態的放大鏡21
2.6 本章小結24
第3章 C與JavaScript互操作25
3.1 JavaScript調用C函數25
3.1.1 定義函數導出宏25
3.1.2 在JavaScript中調用C導出函數27
3.2 JavaScript函數注入C環境30
3.2.1 C函數聲明30
3.2.2 JavaScript實現C函數30
3.2.3 閉包限制及解決辦法32
3.2.4 JavaScript函數注入C環境的優缺點33
3.3 單向透明的內存模型33
3.3.1 Module.buffer34
3.3.2 Module.HEAPX34
3.3.3 在JavaScript中訪問C/C++環境內存35
3.4 JavaScript與C/C++交換數據37
3.4.1 參數及返回值37
3.4.2 通過內存交換數據39
3.4.3 在JavaScript中分配內存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()系列函數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()的潛在風險53
3.8 本章小結56
第二篇 方法篇
第4章 Emscripten運行時58
4.1 main()函數與生命周期58
4.2 消息循環61
4.2.1 emscripten_set_main_loop()61
4.2.2 消息循環的暫停、繼續及終止63
4.3 文件系統65
4.3.1 Emscripten虛擬文件系統架構66
4.3.2 基于MEMFS的打包文件系統67
4.3.3 NODEFS文件系統71
4.3.4 IDBFS72
4.4 內存管理73
4.4.1 內存容量/棧容量73
4.4.2 可變內存74
4.4.3 內存分配器75
4.5 Module定制75
4.6 示例:人臉檢測78
4.6.1 facedetect_cnn()函數78
4.6.2 facedetect_cnn()函數再封裝79
4.6.3 讀取圖像并檢測人臉81
4.6.4 基于SDL顯示IplImage圖像82
4.7 本章小結84
第5章 WebAssembly友好的一般性方法85
5.1 消息循環分離85
5.1.1 emscripten_set_main_loop()的不足85
5.1.2 在JavaScript中創建定時循環86
5.2 內存對齊88
5.2.1 asm.js88
5.2.2 wasm91
5.2.3 避免及檢測未對齊的內存操作92
5.3 使用C接口導出C++對象93
5.4 C++對象生命周期管理97
5.4.1 引用計數97
5.4.2 AddRef()/Release()使用規則98
5.4.3 導出AddRef()/Release()100
5.5 使用C接口注入JavaScript對象103
5.5.1 創建JavaScript對象/ID表103
5.5.2 注入JavaScript對象的生命周期管理104
5.6 小心64位整型數107
5.6.1 WebAssembly原生支持int64108
5.6.2 導出函數包含int64108
5.6.3 注入函數包含int64110
5.7 文件系統的缺陷111
5.8 本章小結112
第6章 網絡I/O113
6.1 XMLHttpRequest113
6.1.1 XMLHttpRequest對象使用簡介113
6.1.2 XMLHttpRequest對象的C接口封裝115
6.1.3 擴展回調處理116
6.2 WebSocket119
6.2.1 創建WebSocket測試服務120
6.2.2 在JavaScript中使用WebSocket121
6.2.3 WebSocket對象的C接口封裝122
6.3 本章小結126
第7章 并發執行127
7.1 JavaScript中的并發模型127
7.2 在Worker中使用Emscripten129
7.3 pthread線程132
7.3.1 原子操作132
7.3.2 pthread示例134
7.3.3 在瀏覽器環境運行pthread示例136
7.4 本章小結137
第8章 GUI及交互138
8.1 Canvas138
8.2 鼠標事件141
8.3 鍵盤事件144
8.4 Life游戲145
8.4.1 Life簡介146
8.4.2 設計要求146
8.4.3 Life游戲C代碼146
8.4.4 Life游戲網頁代碼150
8.4.5 運行Life151
8.5 本章小結152
第三篇 前沿篇
第9章 Rust和WebAssembly154
9.1 Rust入門154
9.1.1 安裝Rust開發環境154
9.1.2 你好,世界155
9.1.3 Cargo管理工程155
9.1.4 本地文檔156
9.2 你好,WebAssembly157
9.2.1 安裝WebAssembly開發環境157
9.2.2 打印“你好,WebAssembly”159
9.3 導入和導出函數159
9.3.1 導出main()函數159
9.3.2 導入宿主打印函數161
9.3.3 導出自定義函數162
9.4 打印命令行參數163
9.4.1 打印字符串163
9.4.2 準備導入env_print_str()函數164
9.4.3 向Rust傳入字符串165
9.4.4 命令行參數封裝168
9.4.5 傳入命令行參數170
9.5 no_std171
9.5.1 輸出文件的大小171
9.5.2 通過no_std裁剪標準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自動構建178
9.7 本章小結181
第10章 WASI系統接口182
10.1 WASI簡介182
10.2 探秘WASI工作原理183
10.2.1 準備工作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虛擬機191
10.3.1 準備WebAssembly測試模塊191
10.3.2 Node.js環境:基于wasi包191
10.3.3 Node.js環境:手工實現fd_write()函數192
10.3.4 Rust環境:導入wasi包193
10.3.5 Rust環境:手工實現fd_write()函數195
10.4 wapm包管理器196
10.4.1 安裝wapm包管理器196
10.4.2 安裝并運行cowsay小程序197
10.4.3 創建wapm模塊198
10.5 本章小結200
附錄
附錄A WebAssembly接口202
附錄B 機器指令211
序: