《深入淺出WebAssembly》
Wasm首著問世 從JavaScript走向全能全語言Web 構建面向未來高性能極速套用
於航 著
ISBN 978-7-121-35217-1
2018年12月出版
定價:128.00元
548頁
16開
基本介紹
- 書名:深入淺出WebAssembly
- 作者:於航
- ISBN:978-7-121-35217-1
- 頁數:548
- 定價:128
- 出版社:電子工業出版社
- 出版時間:2018-12
- 開本:16
編輯推薦
本書帶你一步跨越計算機系統底層機制及C++、編譯原理鴻溝,快速擁抱WebAssembly。
對於想進一步了解語言和瀏覽器引擎原理的開發者來說,這是一本非常好的進階學習書籍。
WebAssembly帶來多語言生態、超Android|iOS的原生性能,是穿透JavaScript最後障礙的銀彈。
從原理入手,深入到渲染引擎、編譯器,詳細介紹各項特性,通過實例介紹WebAssembly開發調試。
內容提要
WebAssembly是一種新的二進制格式,它可以方便地將C/C++等靜態語言的代碼快速地“運行”在瀏覽器中,這一特性為前端密集計算場景提供了無限可能。不僅如此,通過WebAssembly技術,我們還可以將基於Unity等遊戲引擎開發的大型遊戲快速地移植到Web端。WebAssembly技術現在已經被計畫設計成W3C的標準,眾多瀏覽器廠商已經提供了對其MVP版本標準的支持。在Google I/O 2017大會上,Google首次針對WebAssembly技術進行了公開演講和推廣,其Post-MVP版本標準更是對諸如DOM操作、多執行緒和GC等特性提供了支持。WebAssembly所帶來的Web技術變革勢不可擋。
《深入淺出WebAssembly》力求從一些簡單的實踐入手,深入理論,到複雜的具有實際業務價值的綜合實踐,深入淺出地介紹Wasm技術發展至今,其背後所涉及的各種底層設計原理與實現、相關工具鏈以及未來發展方向等多方面內容。本書內容包括:WebAssembly技術的發展歷程,從PNaCl到ASM.js再到WebAssembly,以及這些技術的基本套用方法與性能對比;WebAssembly的標準上層API、底層堆疊機的設計原理,以及對MVP標準理論的深入解讀;與WebAssembly標準相關的進階內容,如單指令多數據流(SIMD)、動態連結(DL)等;LLVM工具鏈與WAT可讀文本格式的相關內容;基於Emscripten工具鏈開發WebAssembly套用的基本流程,以及工具鏈的一些基本常用功能和特性;基於Emscripten工具鏈實現C/C++語言動態關係綁定技術;Emscripten工具鏈所提供的一些如WebGL支持、虛擬檔案系統、套用最佳化以及HTML 5事件系統等高級套用特性;構建一個具有實際業務價值的WebAssembly套用,現階段Wasm生態的發展情況,以及在Post-MVP標準中制訂的一些WebAssembly未來發展規劃。
《深入淺出WebAssembly》的目標讀者為Web前端開發人員、C/C++開發人員和對WebAssembly技術感興趣的人員。
目錄
第1章 漫談WebAssembly發展史 1
1.1 JavaScript的發展和弊端 1
1.1.1 快速發展與基準測試 1
1.1.2 Web新時代與不斷挑戰 8
1.1.3 無法跨越的“阻礙” 11
1.1.4 Chrome V8引擎鏈路 17
1.2 曾經嘗試——ASM.js與PNaCl 28
1.2.1 失落的ASM.js 28
1.2.2 古老的NaCl與PNaCl 42
1.3 新的可能——WebAssembly 57
1.3.1 改變與顛覆 57
1.3.2 一路向前,WCG與WWG 85
第2章 WebAssembly核心原理(基於MVP標準) 90
2.1 套用與標準Web接口 90
2.1.1 編譯與初始化 90
2.1.2 驗證模組 106
2.1.3 遇到錯誤 106
2.1.4 記憶體分配 108
2.1.5 表 112
2.2 深入設計模型——堆疊機 118
2.2.1 堆疊式虛擬機 119
2.2.2 逆波蘭表達式 125
2.2.3 Shunting-yard算法 126
2.2.4 標籤與跳轉 130
2.2.5 條件語句 135
2.2.6 子程式調用 137
2.2.7 變數 138
2.2.8 棧幀 139
2.2.9 堆 140
2.3 類型檢查 141
2.3.1 數據指令類型 142
2.3.2 基本流程控制 144
2.3.3 基於表達式的控制流 149
2.3.4 類型堆疊的一致性 151
2.3.5 不可達代碼 155
2.4 二進制編碼 156
2.4.1 位元組序——大端模式與小端模式 157
2.4.2 基於LEB-128的整數編碼 161
2.4.3 基於IEEE-754—2008的浮點數編碼 164
2.4.4 基於UTF-8的字元串編碼 167
2.4.5 模組數據類型 168
2.4.6 虛擬指令與編碼 169
2.4.7 類型構造符 174
2.5 模組 175
2.5.1 段 175
2.5.2 索引空間 185
2.5.3 二進制原型結構 186
2.6 記憶體結構 196
2.6.1 操作運算符 197
2.6.2 定址 197
2.6.3 對齊 198
2.6.4 溢出與調整 202
第3章 動態連結與SIMD(基於MVP標準) 204
3.1 動態連結(Dynamic Linking) 204
3.1.1 ELF 206
3.1.2 重定向(Relocation) 212
3.1.3 GOT(Global Offset Table,全局偏移表) 225
3.1.4 PLT(Procedure Lookup Table,過程查詢表) 229
3.1.5 基於表的Wasm模組動態連結 233
3.2 單指令多數據流(SIMD) 236
3.2.1 SIMD套用 238
3.2.2 並行與並發 243
3.2.3 費林分類法 244
3.2.4 SIMD.js & TC39 246
3.2.5 WebAssembly上的SIMD擴展 248
第4章 深入LLVM與WAT 250
4.1 LLVM——底層虛擬機 250
4.1.1 傳統的編譯器架構 251
4.1.2 LLVM中間表示層 252
4.1.3 基於LLVM的編譯器架構 254
4.1.4 LLVM最佳化策略 256
4.1.5 LLVM命令行工具 261
4.1.6 WebAssembly與LLVM 267
4.2 基於LLVM開發程式語言 272
4.2.1 圖靈完備與DSL 276
4.2.2 簡易詞法分析器 280
4.2.3 RDP與OPP算法 287
4.2.4 AST 295
4.2.5 簡易語法分析器 296
4.2.6 生成LLVM-IR代碼 303
4.2.7 連結最佳化器 307
4.2.8 編譯到目標代碼 308
4.2.9 整合I/O互動層 312
4.3 WAT 315
4.3.1 S-表達式 317
4.3.2 WAT/Wasm與Binary-AST 319
4.3.3 其他與設計原則 320
第5章 Emscripten基礎套用 322
5.1 利器——Emscripten工具鏈 322
5.1.1 Emscripten發展歷史 322
5.1.2 Emscripten組成結構 324
5.1.3 Emscripten下載、安裝與配置 326
5.1.4 運行測試套件 330
5.1.5 編譯到ASM.js 331
5.2 連線C/C++與WebAssembly 333
5.2.1 構建類型 333
5.2.2 Emscripten運行時環境 342
5.2.3 在JavaScript代碼中調用C/C++函式 351
5.2.4 在C/C++代碼中調用JavaScript函式 362
第6章 基於Emscripten的語言關係綁定 382
6.1 基於Embind實現關係綁定 384
6.1.1 簡單類 389
6.1.2 數組與對象類型 391
6.1.3 高級類元素 393
6.1.4 重載函式 407
6.1.5 枚舉類型 408
6.1.6 基本類型 409
6.1.7 容器類型 411
6.1.8 轉譯JavaScript代碼 413
6.1.9 記憶體視圖 416
6.2 基於WebIDL實現關係綁定 417
6.2.1 指針、引用和值類型 420
6.2.2 類成員變數 422
6.2.3 常量“const”關鍵字 423
6.2.4 命名空間 424
6.2.5 運算符重載 425
6.2.6 枚舉類型 426
6.2.7 接口類 429
6.2.8 原始指針、空指針與void指針 430
6.2.9 默認類型轉換 433
第7章 探索Emscripten高級特性 436
7.1 加入最佳化流程 436
7.1.1 使用編譯器代碼最佳化策略 441
7.1.2 使用GCC壓縮代碼 443
7.1.3 使用IndexedDB快取模組對象 445
7.1.4 其他最佳化參數 452
7.2 使用標準庫與檔案系統 453
7.2.1 使用基於musl和libc++的標準庫 454
7.2.2 虛擬檔案系統結構 457
7.2.3 打包初始化檔案 458
7.2.4 基本檔案系統操作 460
7.2.5 懶載入 469
7.2.6 Fetch API 472
7.3 處理瀏覽器事件 477
7.3.1 事件註冊函式 479
7.3.2 事件回調函式 479
7.3.3 通用類型與返回值類型 481
7.3.4 常用事件 482
7.4 基於EGL、OpenGL、SDL和OpenAL的多媒體處理 485
7.4.1 使用EGL與OpenGL處理圖形 486
7.4.2 使用SDL處理圖形 492
7.4.3 使用OpenAL處理音頻 495
7.5 調試WebAssembly套用 497
7.5.1 編譯器的調試信息 498
7.5.2 使用調試模式 500
7.5.3 手動跟蹤 501
7.5.4 其他常用編譯器調試選項 503
第8章 WebAssembly綜合實踐、發展與未來 504
8.1 DIP綜合實踐套用 504
8.1.1 套用描述 504
8.1.2 濾鏡與卷積 505
8.1.3 基本組件類型與架構 509
8.1.4 編寫基本頁面骨架(HTML與CSS) 510
8.1.5 編寫核心卷積函式(C++) 511
8.1.6 編寫主渲染循環與“膠水”代碼(JavaScript) 513
8.1.7 使用Emscripten編譯並運行套用 518
8.1.8 性能對比 519
8.2 WebAssembly常用工具集 520
8.2.1 Cheerp 520
8.2.2 Webpack 4 522
8.2.3 Go和Rust的WebAssembly實踐 525
8.2.4 Binaryen 527
8.2.5 WasmFiddle 528
8.2.6 Wabt 529
8.2.7 AssemblyScript 529
8.3 WebAssembly未來草案 529
8.3.1 GC(垃圾回收) 530
8.3.2 Multi-Thread(多執行緒)與原子操作 530
8.3.3 異常處理 530
8.3.4 多返回值擴展 530
8.3.5 ES模組 530
8.3.6 尾遞歸 531
8.3.7 BigInts的雙向支持 531
8.3.8 自定義注釋語法 531
序言(一)
I’m very excited to see this book, which covers in great detail a wide range of topics regarding WebAssembly. At this point in time WebAssembly is around one year old - if we count from when it shipped in all major browsers - so it’s still fairly young, and the industry is just starting to figure out how revolutionary it is going to be. The potential is there for huge impact, and good documentation is necessary for that.
Why is WebAssembly’s potential impact so large? For several reasons:
WebAssembly helps make the Web fast: WebAssembly is designed for small download size, fast startup, and predictably fast execution. The improvement compared to JavaScript can be very significant, over 2x in many cases, and especially in startup, where the speedup can be 10x.
WebAssembly makes the Web competitive with native: WebAssembly is designed as a compiler target for multiple languages. That includes C and C++, and in many areas of software the best implementations are in those languages, for example, game engines like Unity and Unreal, design software like AutoCAD, etc. It would take many years to write comparable products in JavaScript; instead, by compiling them to WebAssembly, the Web can be on par with native platforms today.
WebAssembly also fills an industry need outside the Web: WebAssembly is fast, portable, sandboxed, has multiple excellent open source implementations, and just like the Web itself it is an industry standard expected to be supported for the long term. As a result, it’s not surprising that WebAssembly is starting to be used outside of browsers, for example in the blockchain and content delivery network (CDN) spaces.
Looking back, it’s remarkable that our industry has gotten to this point. Just a few years ago, there was no cross-browser collaboration on getting native code to run on the Web. Instead, there were multiple options, including Native Client, Adobe Alchemy, and ASM.js, each with its own advantages and disadvantages. I believe it was the momentum of ASM.js that got the industry to focus on fixing things: ASM.js started out in Firefox, and by virtue of being a subset of JavaScript it immediately ran in all browsers - just not as efficiently. That led top companies in the video game industry and elsewhere to adopt ASM.js, together with Emscripten, the open source compiler to JavaScript that I started in 2010, and which could emit ASM.js. That adoption led to ASM.js support in Edge and later Chrome, at which point there was consensus that the industry should produce a proper standard in this space, which turned into WebAssembly. As the spec was designed and implementations started to appear, we added WebAssembly support to Emscripten, which allowed people to compile to both ASM.js and WebAssembly by just flipping a switch, making it easy for people to use the new technology. Finally, as of May 2018 Emscripten emits WebAssembly by default, and today WebAssembly has robust and stable support both in all major browsers and in the toolchain projects that emit it.
It’s been a complicated path to get here, but the future looks bright. It is especially worth noting that WebAssembly is expected to add features like multithreading, SIMD, GC, and others, which will open up even more interesting opportunities.
Alon Zakai
Alon is a researcher at Mozilla, where he works on compile-to-Web technologies. Alon co-created WebAssembly and ASM.js, and created the Emscripten and Binaryen open source projects which are part of the primary WebAssembly compiler toolchain.
譯文:
我很高興能夠看到這本書的出版,作者在書中詳細地介紹了有關WebAssembly的各種主題。在這本書即將出版之際,WebAssembly差不多一歲了——如果從所有主流的Web瀏覽器開始支持WebAssembly算起,那么這項技術仍然相當年輕,業界也才剛剛開始意識到它將多么具有革命性。WebAssembly所擁有的潛力將會在未來對IT行業產生巨大的影響,但在此之前,我們需要有優秀的文檔。
為什麼WebAssembly的潛在影響力會如此之大?有以下幾個原因。
WebAssembly讓Web套用運行更快。WebAssembly是一種新的格式,檔案體積更小,啟動速度更快,運行速度也更快。與使用JavaScript構建的Web套用相比,性能提升非常明顯。在大部分情況下,運行速度提升兩倍以上,特別是在啟動速度方面,速度提升可以達到10倍。
WebAssembly讓Web套用能夠與原生套用展開競爭。WebAssembly是多種程式語言的編譯器目標,包括C和C++。基於這些程式語言實現的優秀軟體,如遊戲引擎Unity、Unreal,設計軟體AutoCAD等,如果使用JavaScript開發在功能上與這些軟體旗鼓相當的產品可能需要很多年時間。但如果將它們編譯成WebAssembly,這些原生套用就可以直接運行在Web平台上。因此,Web能夠與原生平台相提並論。
WebAssembly還在Web領域之外為行業帶來了其他可能性。WebAssembly運行速度快、可移植,提供了沙箱機制,並擁有眾多優秀的開源實現,就像Web本身一樣,它將會是一個被長期支持的行業標準。因此,WebAssembly開始被套用在Web瀏覽器之外的領域也就不足為奇了,例如區塊鏈和內容分發網路(CDN)。
回首過去,我們的行業能夠取得如此的成就已經很了不起了。幾年前,還沒有人去進行這種跨瀏覽器協作,以便讓原生代碼運行在Web平台上。不過有很多不同的項目,如Native Client、Adobe Alchemy和ASM.js,它們都在嘗試做同樣的事情,只是每個項目都有各自的優缺點。而我認為,是ASM.js的出現讓業界開始專注於解決這個問題——ASM.js最初出現在Firefox中,由於它是JavaScript的一個子集,因此可以無縫地運行在所有瀏覽器中,但運行效率不高。視頻遊戲等行業的一些頂級的公司開始嘗試使用ASM.js和Emscripten(我在2010年開源的編譯器工具鏈,可以將代碼編譯成ASM.js)。由於在這些領域的廣泛套用,Edge以及後來的Chrome均開始支持ASM.js。此時,人們一致認為這個領域需要一個行業標準,於是WebAssembly出現了。
隨著規範設計和實現的不斷演進,我們在Emscripten中加入了WebAssembly支持——只需要在編譯命令中加入一個“開關”,便可選擇性地將編譯目標設定為ASM.js或WebAssembly,從而可以更輕鬆地使用這項新技術。截至2018年5月,Emscripten已經將默認的編譯目標類型改為WebAssembly。今天,WebAssembly已經在所有主流瀏覽器和工具鏈項目中得到了強大而穩定的支持。
一路走來歷經坎坷,但未來是光明的。特別值得注意的是,WebAssembly將會在未來添加多執行緒、SIMD、GC等功能,而這些新特性將會為我們帶來更多有趣的可能性。
——Alon Zakai(Alon是Mozilla的研究員,從事與“編譯到Web平台”相關的研究工作。Alon參與制定了WebAssembly和ASM.js標準,並創建了Emscripten和Binaryen等開源項目,這些項目都是WebAssembly編譯器工具鏈的重要組成部分)
序言(二)
前端的可玩性變得越來越高,也越來越開放了。現如今,我們不僅僅能夠使用HTML、CSS及Javascript來編寫各種跨端的應用程式,WebAssembly的出現還讓我們能夠以極小的成本來復用其他領域已存在的成果,以此來彌補JavaScript在其性能與功能上的不足。
我第一次了解到WebAssembly是在2017年年初,當時沉迷於想自己製作一個基於Node.js環境和樹莓派的語音助手。可惜對於語音處理這個領域來說,JavaScript還是一個“新人”,大量成熟的實現成果主要集中在C/C++領域。因此,對於當時對Node.js擴展及C/C++了解甚少的我來說,這是難度頗大的一個門檻。後來通過Twitter我了解到WebAssembly的前身是ASM.js,於是我立即嘗試使用Emscripten將Google Assistant的Linux SDK編譯為ASM.js,並順利地在Node.js環境中進行了調用,那份喜悅我記憶猶新,同時這也極大地提升了我對這項技術的信心和好感。之後在全民直播的技術提升項目中,我與另一位研發人員有幸一起對最核心的播放器組件編解碼和彈幕協定加密部分進行WebAssembly化,並成功上線且獲得了極大的性能提升。在此之後,我堅信WebAseembly在未來一定會大有可為。
由於WebAssembly是一項極新的技術,因此在最初學習WebAssembly的過程中常常覺得知識零碎且不成體系,經常會出現浮沙駐高塔的情形,感覺入門十分困難。好在本書的出版,讓這種情形不再復現。這本書的好處就是它系統詳細地講述了WebAssembly的方方面面,由淺入深地構建了整個WebAssembly的知識體系。不管你是剛接觸WebAssembly的新人,還是已經在工作場景中使用WebAssembly的“老鳥”,通過閱讀這本書都能夠得到極大的提升。總之,如果你想了解WebAssembly,或者想補足相關的知識體系,它都是一本不可多得的案頭好書。風雨欲來,如果現在還不進行WebAssembly的技術儲備,更待何時?
最後,我要感謝於航讓我第一時間讀到如此精彩的作品,同時也感謝他對WebAssembly在國內的布道普及所做的工作,我相信WebAssembly的未來一定會更加美好,Web的未來也會更加開放和美好。
——趙洋(趙洋是“全民直播”的前端研發經理,曾經主導全民直播播放器編解碼核心模組及彈幕協定加密過程WebAssembly化)
作者簡介
於航,現就職於阿里巴巴 / 餓了么事業部(BU),資深前端工程師,FreeCodeCamp(FCC) China 上海社區負責人,QCon(2017)上海前端專場講師。2016 年開始研究 WebAssembly 技術,2017 年加入 WebAssembly 中國社區,同年加入官方WCG(W3C Community Group),定期參與 WCG組織的各種線上視頻研討會議,在跟進 WebAssembly 最新發展的同時,也為 WebAssembly 的標準化提出自己的建議和意見。生活中喜歡彈鋼琴、演講與分享。主要技術研究方向為Web前端與基礎設施架構、WebAssembly、LLVM以及編譯器等相關領域。
媒體評論
WebAssembly在前端領域是一種全新的技術,它讓Web的世界變得更豐富、更強大,同時可以作為一座橋樑把更多語言、生態和社區匯入Web之中。這本書從如何使用WebAssembly到其背後的原理和周邊的工具都做了方方面面的介紹,希望可以幫助讀者進入WebAssembly的大門,同時也期待未來大家在WebAssembly上有更多的實踐。
——趙錦江,阿里巴巴高級前端技術專家(花名“勾股”,開源項目Vue.js團隊的一員,曾任W3C HTML中文興趣組聯合主席)
作為一種面向未來的技術,WebAssembly很有可能是解決JavaScript痼疾的一顆“銀色子彈”。作為一名JavaScript工程師,很有必要率先對WebAssembly進行深入了解。非常可惜的是,WebAssembly涉及過多的計算機系統相對底層的機制,沒有系統學習過C++、編譯原理等內容的JavaScript程式設計師會感到無從下手。本書很好地填補了這一空白,作者首先假設讀者只具備最淺顯的C++知識,由淺入深地帶你走入WebAssembly的世界。在武俠小說的體系中,武功通常被分為“招式”和“內力”兩種。招式可以讓習武者快速拉開自己與普通人之間的差距,但是高手過招,看似不起眼的內力才是最重要的。如果你只擅長JavaScript一種招式並且內力不足,那么在閱讀這本書的過程中會倍感吃力。如果堅持下來,最終自身的“內力”會得到顯著增強,你將學到很多雖然對眼下工作並無幫助,但是會讓你的編程人生收穫頗多的知識。
——王澤,白鷺引擎首席架構師
本書從原理入手,深入到渲染引擎、編譯器,詳細介紹WebAssembly的各項特性,同時通過實例介紹如何使用WebAssembly進行開發調試。對於想進一步了解語言和瀏覽器引擎原理的開發者來說,這是一本非常好的進階學習書籍。
——徐川,InfoQ中國主編
WebAssembly是一項很棒的技術。Web平台第一次有了不弱於Android和iOS的原生性能,第一次混入了多語言生態。它解決了Web平台的兩個痛點:一個是性能;一個是單語言生態。而這些對於未來Web的發展都是具有深遠影響的。因此,掌握WebAssembly技術,也是未來Web開發的一個趨勢。但由於WebAssembly技術的複雜性,理解和掌握這項技術並不是一件容易的事情。這本書從WebAssembly的設計和原理出發,由淺入深,最後轉入實踐和套用,幫助Web開發人員充分理解WebAssembly的知識體系。它幾乎涵蓋了理解WebAssembly所需要的所有知識,是WebAssembly領域不可多得的好書。
——郭力恆,廣發證券前端架構師(QCon講師,曾在騰訊、迅雷等網際網路公司擔任資深前端開發工程師,負責多項產品的研發)
前言
為什麼要寫這本書
自從JavaScript(後面簡稱JS)腳本語言於1995年誕生以來,人們便一直在使用該語言以及HTML與CSS來編寫和開發以瀏覽器為主的Web套用。近年來,隨著JS的不斷流行,以及Node.js的出現,JS也開始逐漸向除Web前端之外的其他領域發力,比如開發後端套用、機器學習套用乃至硬體編程等領域。但就JS本身而言,所不能無視的是它是一種弱類型語言,因此,相比於C/C++等強類型語言,儘管Chrome V8、SpiderMonkey等JS引擎已經通過諸如JIT等多種技術手段來最佳化JS腳本代碼的整體執行效率,但引擎每一次版本最佳化的疊代速度(所花費的時間)卻遠遠跟不上當今各類Web套用的複雜程度變化。因此,發明一種能夠從根本上解決該問題的技術便顯得迫在眉睫。
曾曇花一現的ASM.js、NaCl與PNaCl等技術都嘗試以其各自的方式來最佳化Web套用的執行效率,但由於其所存在的諸如“瀏覽器兼容性不佳”以及“性能最佳化不徹底”等問題,導致它們最終並沒有被廣泛推廣。而在2015年出現的WebAssembly(簡稱Wasm)技術,便是在吸取了前者經驗教訓的基礎上而被設計和發明出來的。現在,我們可以看到該項技術所具有的潛力——W3C成立了專門的WWG工作組來負責Wasm技術的標準疊代與實現,四大主流瀏覽器(Google Chrome、FireFox、Edge和Safari)已經全部實現WebAssembly技術在其MVP標準中制定的所有特性,C/C++、Go和Rust等高級語言已經逐漸開始支持編譯到Wasm格式。這一系列的發展和變化都說明了人們對該項技術所寄予的厚望。
如今世間百態,萬物的發展速度越來越快,而前端技術領域也同樣如此,正在轉向技術融合的道路——從2000年專門指代PC網頁技術的Web前端,到2010年左右包含有H5技術的前端,再到融合了移動端甚至部分後端技術的“大前端”。“前端”一詞所指代的技術實體正變得越來越模糊,已經不單單是指我們所熟知的JS、HTML與CSS了,正如大學裡生物學專業與化學專業兩者融合後所形成的“生物化學專業”一樣。技術本身並無好壞之分,只有能否適用於某些業務場景。而技術的融合則正好能夠發揮各項技術本身所具備的優勢,達到“1+1>2”的效果。WebAssembly技術便正是如此。
在寫作本書的過程中,筆者曾與WWG的核心成員Alon、Ben和JF等專家進行了多次交流,以力求保證書中各個技術細節的正確性。但Wasm技術發展非常之快,比如Emscripten工具鏈每天都會有眾多的“commit”被提交到主分支中,新版本的發布也是以“周”甚至“天”為單位進行的。因此,書中所述內容並不保證會在今後的半年甚至一年時間裡都具有時效性。而對於相關內容的時效性變化,筆者也會在對應於本書的Github倉庫(詳見“勘誤和支持”部分)中及時進行標註。作為國內第一本介紹WebAssembly的技術書籍,希望本書的內容能夠為國內網際網路基礎技術的發展做出微小的貢獻。雖然現階段我們還無法完全地自主創新,或者參與到各項國際技術標準的制定過程中,但唯有緊跟其腳步,才能夠伺機超越。
本書特色
作為市面上第一本深入介紹WebAssembly技術的相關書籍,筆者嘗試由淺入深地來介紹與Wasm技術相關的各種底層理論知識,以及相關編譯器工具鏈的內部實現結構與使用方法。WebAssembly技術從其第一版MVP標準誕生至今,時間過去並不久,但抽象的英文官方文檔並不適合各類Web前端開發工程師直接進行閱讀。從另一個方面來看,雖然我們可以在國內如“百度”等中文搜尋引擎上找到部分與Wasm實踐相關的介紹文章,但它們大都不會深入該技術標準的背後,探尋該技術的底層設計本質。因此,本書力求從一些簡單的實踐入手,深入理論,再到複雜的具有實際業務價值的綜合實踐,深入淺出地介紹Wasm技術發展至今,其背後所涉及的各種底層設計原理與實現、相關工具鏈以及未來發展方向等多方面內容。
由於WebAssembly並不是一種單方面的前端或後端技術,因此在本書中,我們將會隨著內容的深入逐漸接觸到除Web前端技術之外的諸如編譯原理、V8引擎、LLVM以及Linux動態連結等多方面內容。筆者將會用最簡單和直觀的方式,由淺入深地介紹這些平日裡可能很少接觸到的技術與特性。
另外,作為市面上首本與WebAssembly相關的純技術類書籍,筆者只能從自己所接觸到的Wasm相關技術中,按照各個知識點的相關性與重要性來編排內容。相信讀者在讀完整本書後,一定會對Wasm技術背後的實現原理以及相關技術有著進一步的理解。
讀者對象
□ Web前端開發人員。
□ C/C++開發人員。
□ 對WebAssembly技術感興趣的人員。
本書內容
本書分為8章。
第1章:本書的開篇,主要介紹WebAssembly技術的發展歷程,從PNaCl到ASM.js再到WebAssembly,以及這些技術的基本套用方法與性能對比。
第2章:介紹WebAssembly的標準上層API、底層堆疊機的設計原理,以及對MVP標準理論的深入解讀。
第3章:介紹與WebAssembly標準相關的進階內容,如單指令多數據流(SIMD)、動態連結技術等。
第4章:由淺入深地介紹LLVM工具鏈與WAT可讀文本格式的相關內容。
第5章:從理論走向實踐,從本章開始介紹基於Emscripten工具鏈開發WebAssembly套用的基本流程,以及工具鏈的一些基本常用功能和特性。
第6章:介紹基於Emscripten工具鏈實現的C/C++語言動態關係綁定技術。
第7章:從基礎走向深入,繼續介紹Emscripten工具鏈所提供的一些如WebGL支持、虛擬檔案系統、套用最佳化以及事件系統等高級套用特性。
第8章:構建一個具有實際業務價值的WebAssembly套用,並介紹現階段Wasm生態的發展情況,以及在Post-MVP標準中制訂的一些WebAssembly未來發展規劃。