-- 會員 / 註冊 --  
 帳號:
 密碼:
  | 註冊 | 忘記密碼
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書號: 53532
詢問書籍請說出此書號!

缺書
NT售價: 395

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

譯者序:

前言:

為何編寫本書

萬維網(World Wide Web,簡稱Web)問世至今,一直在不斷完善,與Web相關的技術也一直在不停演進。每一次新技術的出現,都會讓這張無形卻又無處不在的網變得更加強大和易用,給人們的生活帶來巨大的變化,甚至變革。

Web技術始于1990年前后,標志事件是當時在歐洲核子研究中心(CERN)工作的Tim Berners-Lee發明了超文本傳輸協議(Hypertext Transfer Protocol,HTTP)和超文本標記語言(Hypertext Markup Language,HTML)。時至今日,這兩項技術仍然是Web的基石。最初發布時,這兩項技術都比較簡單,比如HTTP協議只支持GET請求,HTML語言只支持少量標簽。另外,在那個年代,因為沒有好用的圖形用戶界面瀏覽器,這兩項技術的推行也不是很順利。

第一款“好用”的瀏覽器發布于1993年,名叫Mosaic,由Marc Andreessen和Eric Bina等人合作開發。他們兩人于1994年和Jim Clark等人聯合創辦了后來風光無限的網景(Netscape)公司,該公司推出的Navigator瀏覽器也曾紅極一時,對Web技術的普及和發展起到了非常大的推動作用。隨后,微軟公司推出了著名的IE瀏覽器,引發了第一次瀏覽器大戰,并最終贏得了勝利。戰敗的網景公司將Navigator瀏覽器代碼開源,創建了Mozilla基金會。該基金會于2004年正式發布了Firefox瀏覽器。順便說一下,蘋果公司于2003年正式發布Safari瀏覽器;Google公司于2008年正式發布Chrome瀏覽器并在第二次瀏覽器大戰中獨占鰲頭。

隨著瀏覽器的快速普及,最初的HTML語言已經無法滿足網頁作者和用戶的需求。當時的HTML只能通過標簽展現某些固定的樣式,比如標題格式、段落格式、文字高亮、簡單的列表。而網頁作者們想要更多的控制權,比如改變文本字體和顏色、段落背景顏色、文字對齊方式。1994年,當時還在CERN工作的Hkon Wium Lie發布了層疊樣式表(Cascading Style Sheet,CSS)草案,試圖改變這一局勢。在吸收了Bert Bos等人的意見之后,CSS規范于1996年年底發布。CSS規范很快得到了微軟IE、網景Navigator以及Opera等主流瀏覽器的支持。我們今天能看到各種賞心悅目的網頁,CSS規范功不可沒。

雖然有了CSS規范之后網頁好看了很多,但仍然是靜態的。Web急需一種腳本語言,讓網頁“活”起來。這次打頭陣的是網景公司。1995年,網景發布了Navigator 2.0瀏覽器,支持由該公司Brendan Eich設計的JavaScript腳本語言。微軟公司緊隨其后,在1996年發布的IE 3.0瀏覽器中支持JScript腳本語言。為了推動瀏覽器腳本語言的標準化,網景公司在1996年年底將JavaScript語言提交給了歐洲計算機制造商協會(ECMA)。該協會于1997年6月發布了ECMAScript 1.0規范。有了JavaScript腳本執行能力,瀏覽器從單純的內容展示工具升級成了應用運行平臺,開啟了全新的Web時代。

在JavaScript發展的過程中,還涌現出了很多技術,比如DHTML(1997年)、JSON(2000年)、Ajax(2005年)等,這里就不一一介紹了。隨著這些技術的出現,JavaScript越來越強大,很多原來無法想象的應用都可以運行在瀏覽器上了。然而,新的問題開始顯露出來:JavaScript的運行速度太慢了。

2008年,Google公司推出了Chrome瀏覽器,并在其內部搭載了全新設計的JavaScript引擎V8。通過使用JIT編譯等優化技術,V8引擎的運行速度快了很多。在Chrome的壓力下,其他瀏覽器廠商也紛紛改進技術,使得JavaScript運行速度慢的問題暫時得以緩解。同時,V8引擎還激發了Node.js技術的誕生,讓JavaScript語言重新回到后端領域,這里就不詳細介紹了。

如前所述,Web技術從未停止發展的腳步。隨著移動互聯網的興起,HTML5應運而生(2008年公開草案,2014年正式發布)。2015年,WebAssembly(簡稱Wasm)技術首次亮相。Wasm技術旨在將匯編語言和Web融合,讓瀏覽器能夠以接近本地程序的速度運行網頁應用程序。如今,Wasm規范已經正式發布(寫作本書時,版本為1.1),并且獲得了各大瀏覽器的普遍支持。雖然誕生于Web,但是從設計之初,Wasm就避免和瀏覽器綁定在一起,這使得它可以應用于更多地方。相信在不久的未來,Wasm技術一定會大有所為。

你是否已經迫不及待地想要了解Wasm技術?本書將帶你領略Wasm技術的方方面面,為迎接即將到來的Web新時代做好準備!

本書主要內容

本書共14章,分為4個部分,內容安排如下。

第一部分(概述)

第1章:介紹Wasm技術并準備編程環境。

第二部分(二進制和文本格式)

第2章:介紹Wasm模塊整體結構和二進制編碼格式。

第3章:介紹Wasm指令集和指令編碼格式。

第4章:介紹Wasm文本格式。

第三部分(虛擬機和解釋器)

第5章:介紹Wasm操作數棧以及參數和數值指令。

第6章:介紹Wasm內存和內存指令。

第7章:介紹Wasm函數調用機制,以及直接函數調用指令和變量指令。

第8章:介紹Wasm控制指令。

第9章:介紹本地函數調用機制,以及Wasm表和間接函數調用指令。

第10章:介紹Wasm導入和導出機制,以及鏈接和實例化邏輯。

第11章:介紹Wasm各個語義階段可能出現的錯誤,以及驗證規則。

第四部分(進階)

第12章:以Rust語言為例,介紹如何將高級語言編譯為Wasm模塊。

第13章:介紹AOT編譯技術,以及如何將Wasm模塊編譯為Go語言插件。

第14章:介紹Wasm目前存在的一些不足之處,以及后續版本的改進方向。

本書讀者對象

本書適合有一定編輯基礎且對Web前沿技術或高級語言虛擬機技術感興趣的讀者。書中有少量Rust示例代碼,都比較簡單易懂,即使不了解Rust語言也不影響閱讀。本書將使用Go語言實現Wasm解釋器,但并沒有用到特別高深的技術,加之Go語言語法比較簡單,相信對于有C系列語言(比如C/C++/C#、Java、JavaScript等)基礎的讀者來說,書中的代碼不難理解。總的來說,本書主要面向以下這幾類讀者。

想要深入了解Wasm技術的Web前后端程序員。

想要深入了解Wasm技術的區塊鏈(尤其是智能合約平臺)程序員。

想要深入了解Wasm技術,并把它應用在其他領域的程序員。

對高級語言虛擬機原理和實現感興趣的讀者。

對解釋器、AOT編譯器原理和實現感興趣的讀者。

想找中小型項目練手的Go語言初學者或者初、中級程序員。

想閱讀Wasm規范但覺得內容枯燥的讀者。

如何閱讀本書

本書延續了我“自己動手”系列叢書的風格,每章均配有精心安排的代碼。本書將帶領讀者循序漸進地實現Wasm,每一章的代碼都建立在前一章代碼的基礎之上,但又都可以單獨編譯和運行。建議讀者從第1章開始,按順序閱讀本書,編寫或修改每一章的代碼。當然,直接跳到感興趣的章節進行閱讀,必要時再學習其他章節,也是可以的。本書的源代碼可以從https://github.com/zxh0/wasmgo-book獲取。

主要參考資料

Wasm是一種相對新的技術,但是網上已經有很多相關的資料和優秀的文章。下面列出一些主要的參考資料,供讀者學習與參考。

Wasm官網


相關規范

WebAssembly Core Specification

WebAssembly JavaScript Interface Specification

WebAssembly Web API Specification

asm.js Specification

相關論文

Bringing the web up to speed with WebAssembly

Emscripten: An LLVM-to-JavaScript Compiler

JavaScript: The First 20 Years

勘誤和支持

由于技術水平和表達能力所限,本書并非盡善盡美,如有不合理之處,懇請讀者批評指正。由于寫作時間倉促,Wasm規范也在快速變化,書中難免會存在一些疏漏,還請讀者諒解。

本書的勘誤將通過GitHub發布和更新。如果讀者發現書中的錯誤,對內容有改進建議,或者有任何問題,都可以在本書的GitHub項目上提交Issue。另外,歡迎大家加入本書讀者微信群與我以及其他讀者進行交流,微信群二維碼將在本書GitHub項目主頁不定期更新。

致謝

寫書是一件耗時費力的事情,如果沒有家人、同事和朋友的支持與幫助,這本書恐怕還要再過很長時間才能寫完(或者永遠都寫不完)。這里我要感謝家人的理解,在寫作期間,我有數不清的時間把自己關在小書房里,這些時間本應該用來陪伴家人。還要感謝同事和好友們的幫忙,感謝你們抽出時間閱讀本書初稿并提出寶貴意見,雖然無法在此一一列出你們的名字,但你們是最棒的。特別感謝我的好朋友武岳抽空為本書繪制鼴鼠圖,這些圖很可愛,我很喜歡。最后要感謝機械工業出版社華章公司的編輯們,你們認真負責的工作保證了本書的質量,與你們合作非常愉快。
內容簡介:

WebAssembly是棧式虛擬機和字節碼技術的最新應用,在Web開發、后端開發、區塊鏈等領域大顯身手,越來越受歡迎。

本書是WebAssembly入門和進階的必讀書,它不僅對WebAssembly的工作原理、核心技術和規范進行了全面的剖析和解讀,而且給出了實現WebAssembly解釋器和AOT編譯器的思路和代碼。

本書共14章,分為四個部分。

第一部分 概述(第1章)

主要介紹了WebAssembly的概念、發展歷史以及閱讀本書需要做的準備工作。

第二部分 二進制和文本格式(第2∼4章)

詳細講解了WebAssembly的二進制格式、文本格式以及指令集。

第三部分 虛擬機和解釋器(第5∼11章)

詳細講解了WebAssembly的解釋器和虛擬機的工作原理以及實現思路,包括操作數棧、內存、函數調用、控制指令、鏈接和實例化、錯誤處理和驗證等。

第四部分 進階(第12∼14章)

深入講解了AOT編譯器的實現思路和WebAssembly的提案等內容。

通過閱讀本書,讀者不僅可以理解WebAssembly的核心原理,還可以學習如何實現WebAssembly解釋器和AOT編譯器。既收獲了“魚”,又學會了“漁”。
目錄:

前言
第一部分 概述
第1章  Wasm介紹 3
1.1 Wasm簡史 3
1.2 Wasm簡介 6
1.3 準備工作 10
1.4 你好Wasm 11
1.5 本章小結 13
第二部分 二進制和文本格式
第2章 二進制格式 17
2.1 二進制格式介紹 17
2.1.1 Wasm二進制格式總體結構 18
2.1.2 索引空間 21
2.1.3 實體類型 23
2.2 二進制格式分析 25
2.2.0 魔數和版本號 25
2.2.1 類型段 26
2.2.2 導入段 28
2.2.3 函數段 30
2.2.4 表段 30
2.2.5 內存段 31
2.2.6 全局段 32
2.2.7 導出段 33
2.2.8 起始段 34
2.2.9 元素段 35
2.2.10 代碼段 35
2.2.11 數據段 37
2.2.12 自定義段 38
2.3 二進制格式解碼 39
2.3.1 LEB128介紹 39
2.3.2 解碼基本類型 41
2.3.3 解碼向量類型 44
2.3.4 處理tag 44
2.3.5 解碼代碼項和表達式 45
2.3.6 解碼整體結構 45
2.3.7 處理錯誤情況 47
2.4 實現dump命令 48
2.5 本章小結 50
第3章 指令集 51
3.1 指令集介紹 51
3.1.1 操作碼 51
3.1.2 助記符 53
3.1.3 立即數 54
3.1.4 操作數 57
3.2 指令分析 58
3.2.1 數值指令 58
3.2.2 變量指令 60
3.2.3 內存指令 61
3.2.4 結構化控制指令 62
3.2.5 跳轉指令 64
3.2.6 函數調用指令 65
3.3 指令解碼 66
3.4 完善dump命令 69
3.5 本章小結 70
第4章 文本格式 71
4.1 基本結構 71
4.1.1 類型域 72
4.1.2 導入和導出域 73
4.1.3 函數域 75
4.1.4 表域和元素域 75
4.1.5 內存域和數據域 76
4.1.6 全局域 77
4.1.7 起始域 77
4.2 指令 78
4.2.1 普通形式 78
4.2.2 折疊形式 79
4.3 本章小結 81
第三部分 虛擬機和解釋器
第5章 操作數棧 85
5.1 操作數棧 85
5.2 虛擬機 87
5.2.1 指令循環 88
5.2.2 指令分派 88
5.3 參數指令 89
5.3.1 drop指令 90
5.3.2 select指令 90
5.4 數值指令 91
5.4.1 常量指令 92
5.4.2 測試指令 92
5.4.3 比較指令 93
5.4.4 一元算術指令 95
5.4.5 二元算術指令 96
5.4.6 類型轉換指令 99
5.5 本章效果 103
5.6 本章小結 105
第6章 內存 107
6.1 內存介紹 107
6.2 內存實現 108
6.3 內存指令 109
6.3.1 size和grow指令 110
6.3.2 加載指令 111
6.3.3 存儲指令 113
6.4 本章效果 115
6.5 本章小結 117
第7章 函數調用(上) 119
7.1 函數調用介紹 119
7.2 函數調用實現 122
7.2.1 增強操作數棧 123
7.2.2 添加調用棧 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 本章小結 135
第8章 控制指令 137
8.1 控制指令介紹 137
8.1.1 跳轉標簽 138
8.1.2 跳轉標簽索引 139
8.1.3 塊類型 141
8.2 控制指令實現 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 本章小結 153
第9章 函數調用(下) 155
9.1 本地函數調用 155
9.1.1 本地函數介紹 155
9.1.2 統一兩種函數 158
9.1.3 調用本地函數 159
9.1.4 鏈接本地函數 161
9.1.5 測試本節代碼 162
9.2 間接函數調用 163
9.2.1 間接函數調用介紹 163
9.2.2 實現表 165
9.2.3 初始化表 166
9.2.4 call_indirect指令 167
9.2.5 測試本節代碼 168
9.3 本章小結 169
第10章 鏈接和實例化 171
10.1 定義實例接口 171
10.2 實現實例接口 174
10.2.1 函數 174
10.2.2 表 176
10.2.3 全局變量 177
10.2.4 虛擬機 177
10.3 實例化模塊 178
10.4 本章效果 180
10.5 本章小結 183
第11章 錯誤處理和驗證 185
11.1 各種錯誤 186
11.1.1 解碼錯誤 186
11.1.2 結構錯誤 188
11.1.3 實例化錯誤 189
11.1.4 運行時錯誤 190
11.2 驗證整體結構 190
11.3 驗證函數字節碼 192
11.3.1 數據結構 193
11.3.2 操作數棧 194
11.3.3 控制棧 195
11.3.4 驗證指令 197
11.4 本章效果 198
11.5 本章小結 199
第四部分 進階
第12章 編譯為Wasm 203
12.1 控制指令 203
12.2 參數指令 207
12.3 變量指令 208
12.4 內存指令 210
12.5 數值指令 213
12.6 本章小結 215
第13章 AOT編譯器 217
13.1 AOT介紹 217
13.2 編譯模塊 219
13.3 編譯函數 220
13.3.1 內部函數 221
13.3.2 外部函數 222
13.3.3 導出函數 222
13.3.4 輔助方法 223
13.4 編譯指令 224
13.4.1 參數指令 224
13.4.2 變量指令 225
13.4.3 內存指令 226
13.4.4 數值指令 227
13.4.5 結構化控制指令 228
13.4.6 跳轉指令 230
13.4.7 函數調用指令 231
13.5 本章效果 233
13.6 本章小結 234
第14章 提案和前景 235
14.1 提案 235
14.1.1 多塊內存 237
14.1.2 內存塊操作 237
14.1.3 引用類型 239
14.1.4 尾遞歸調用 241
14.1.5 異常處理 242
14.1.6 多線程支持 244
14.1.7 其他提案 247
14.2 前景 248
附錄A Wasm指令表 249
附錄B 二進制格式 253
附錄C WAT語法 255
序: