本書的主要內(nèi)容有:提升代碼在不同平臺之間的可移植性。實現(xiàn)跨語言和跨環(huán)境的代碼復用。強化對主要安全威脅的防護能力。在Web環(huán)境中部署遺留系統(tǒng)代碼。擴大用戶和開發(fā)者群體,覆蓋多種語言和技術棧。與JavaScript無縫集成,提升整體系統(tǒng)的性能、安全性和開發(fā)效率。理解WebAssembly對軟件開發(fā)職業(yè)生涯帶來的深遠影響。
編輯推薦
本書是對當今軟件行業(yè)中最ZZ具變革性的技術之一WebAssembly的一部全面且通俗易懂的權C威指南。WebAssembly最ZZ初被設計為在瀏覽器中使用JavaScript之外的編程語言的一種方式,如今已發(fā)展為一種強大手段,具備良好的可移植性、卓越的性能、更高的安全性,并支持在多種部署環(huán)境中實現(xiàn)代碼的高效復用。
作者通過構建多個具體、實用、前沿且以代碼驅(qū)動的WebAssembly應用示例,循序漸進地介紹了該技術的核心要素。無論你身處企業(yè)級軟件開發(fā)、嵌入式系統(tǒng)、娛樂產(chǎn)業(yè)、科學計算,還是創(chuàng)業(yè)公司環(huán)境中,都能從本書中了解到WebAssembly如何深刻影響軟件開發(fā)方式。
專家推薦
想知道下一代的可視化與用戶交互會是什么樣子?答案盡在這本書。
Hannah Thoreson
系統(tǒng)工程師
前言我相信WebAssembly 是一項正在崛起的技術,它有潛力以某種形式改變整個軟件開發(fā)行業(yè)。我不相信WebAssembly 會帶來變革,因為我正在寫一本關于這個話題的書。我正在寫一本書,因為我相信這件事將會帶來變革。想必你也對該技術感興趣。問題是,與許多作者相比,我認為我對你作為讀者的了解更少。如果這是一本關于特定編程語言或特定主題的書,那么讀者可以自行選擇,我可以快速地進行下去。但是WebAssembly 是一個比大多數(shù)人意識到的要大得多的話題,我試圖用這本書描繪一個非常大的圖景。大多數(shù)已經(jīng)出版的書都只關注它的某個方面,我能理解這是為什么。有些人可能認為WebAssembly 是一種替代JavaScript 的技術,其實并不是。有些人可能認為這是將應用程序引入瀏覽器,也的確如此,但它遠不止于此。它在服務器端、視頻游戲世界、作為插件機制、支持無服務器功能和邊緣計算、嵌入式系統(tǒng)、區(qū)塊鏈,以及我們將共同研究的許多其他主題中都很有用。這是我所知道的第一次嘗試對該主題進行如此全面的討論,我覺得告訴這個更完整的版本十分重要。在這本書的籌備階段,當我與人們討論這個項目時,總是獲得了積極的支持和令人興奮的反饋。唯一反對的也是關于標題的。有些人認為,現(xiàn)在為這項新技術制定權威指南還為時過早。這是一個公平的立場,但因為我試圖描述一個非常大且包羅萬象的技術領域,所以我認為這是合理的。我希望在本書的最后你也同意。我所要求的只是你有一個開放的心態(tài)和一點耐心。WebAssembly 涉及多種語言、運行時和操作環(huán)境。除了向你介紹底層細節(jié)之外,我們還將研究與該領域中主要編程語言的集成以及幾個不同的用例。我試著不去對你的背景做太多的假設,所以我在文本中添加了大量的注釋,以便通過腳注進行進一步的探索和發(fā)現(xiàn)。如果你是一名更高級的開發(fā)人員,只是想了解有關WebAssembly 的詳細信息,請隨時忽略這些內(nèi)容,不要介懷。我希望至少有相當多的讀者會精讀本書,我也希望他們感到愉悅。如果你是初級開發(fā)者,這將是一本具有挑戰(zhàn)性的書。但我已經(jīng)盡力讓你至少能看到發(fā)生了什么?紤]將各種鏈接和參考資料作為個人指南,了解更復雜的開發(fā)現(xiàn)實。不要不知所措,按照你感興趣或有意義的順序,一次解決一個問題。進入這個行業(yè)沒有單一的方法,無論你如何進入都是合理的。歸根結底,WebAssembly 將允許我們基于我們選擇的編程語言并在幾乎任何計算環(huán)境中安全地運行它們。我們以前曾得到過這樣的承諾,但我認為這一次更有可能實現(xiàn)。謝謝你給我解釋的機會。排版約定本書采用以下排版約定。斜體(Italic)表示新術語、URL、電子郵件地址、文件名和文件擴展名。等寬字體(Constant width)表示程序清單,在段落內(nèi)表示程序元素,例如變量、函數(shù)名稱、數(shù)據(jù)庫、數(shù)據(jù)類型、環(huán)境變量、語句和關鍵字。粗體等寬字體(Constant width bold)表示應由用戶原封不動輸入的命令或其他文本。斜體等寬字體(Constant width italic)表示應該替換成用戶提供值的文本,或者由上下文決定的值。使用示例代碼補充材料(代碼例、練習等)可在https://github.com/bsletten/wasm_tdg 下載。如果你有技術問題或在使用代碼例時遇到問題, 請發(fā)送電子郵件至bookquestions@oreilly.com。本書旨在助你一臂之力。一般來講,你可以在你的程序和文檔中使用本書提供的示例代碼。除非你要復制大量的代碼,否則你無需聯(lián)系我們以獲得授權。例如,編寫使用本書中幾段代碼的程序不需要獲得授權。出售或分發(fā)OReilly 書籍中的例確實需要獲得授權。通過引用本書和引用例代碼來回答問題不需要授權。將本書中的大量例代碼合并到你的產(chǎn)品文檔中確實需要獲得授權。使用本書中的例代碼時,希望你能標明它的出處,但不強求。署名通常包括書名、作者、出版商和ISBN。例如:WebAssembly: The Definitive Guide by Brian Sletten (OReilly). Copyright 2022 Bosatsu Consulting, Inc., 978-1-492-08984-1。如果你覺得你對代碼例的使用不屬于合理使用范圍或上述許可范圍之外,請隨時與我們聯(lián)系:permissions@oreilly.com。OReilly 在線學習平臺(OReilly Online Learning)近40 年來,OReilly Media 致力于提供技術和商業(yè)培訓、知識和卓越見解,來幫助眾多公司取得成功。公司獨有的專家和改革創(chuàng)新者網(wǎng)絡通過OReilly 書籍、文章以及在線學習平臺,分享他們的專業(yè)知識和實踐經(jīng)驗。OReilly 在線學習平臺按照您的需要提供實時培訓課程、深入學習渠道、交互式編程環(huán)境以及來自OReilly 和其他200 多家出版商的大量書籍與視頻資料。更多信息,請訪問網(wǎng)站:https://www.oreilly.com/。聯(lián)系我們?nèi)魏斡嘘P本書的意見或疑問,請按照以下地址聯(lián)系出版社。美國:OReilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中國:北京市西城區(qū)西直門南大街2 號成銘大廈C 座807 室(100035)奧萊利技術咨詢(北京)有限公司勘誤、示例和其他信息可訪問https://oreil.ly/webassemblyTDG 獲取。對本書中文版的勘誤可以發(fā)電子郵件到errata@oreilly.com.cn。欲了解本社圖書和課程的新聞和信息,請訪問我們的網(wǎng)站http://oreilly.com。我們的Facebook:http://facebook.com/oreilly。我們的Twitter:http://twitter.com/oreillymedia。我們的YouTube:http://youtube.com/oreillymedia。致謝有時,我們自己的光會熄滅并被另一個人的火花重新點燃。我們每個人都有理由深切感謝那些點燃我們內(nèi)心火焰的人。 Albert Schweitzer關于唯一作者的錯誤觀點一直存在,我要感謝廣大社區(qū)的人們,感謝他們制作了這本書,感謝他們一直以來對我的幫助。另外,任何錯誤、不準確和問題都由我自己負責。我想從較大的WebAssembly 社區(qū)開始。他們在設計這個平臺方面做得非常出色,而且沒有過度設計。這是一個不斷變化的目標,他們忙于處理和平衡過剩的競爭問題。一路走來,他們留下了一些面包屑來解釋過去的決策,并為未來奠定基礎。我特別關注Lin Clark 的貢獻,她已經(jīng)成為了我最喜歡的技術傳播者之一。她不僅在時間上很慷慨,而且她對復雜主題的卡通介紹也是我遇到過的最有效的技術交流形式之一。OReilly 社區(qū)是一個一流的組織。我在那里遇到的每個人,無論是現(xiàn)在還是過去,都是該品牌的堅實代表。我要感謝Mike Loukides 抽出時間來討論我更大的觀點,并建議我們從WebAssembly 開始。我的編輯Zan McQuade 和Angela Rufino 一直是這個項目的堅定擁護者,他們對工作有著絕對的耐心。Kate Galloway 和她的團隊幫助我沖過了終點線。我要特別感謝Karen Montgomery的精美封面。我家狗的美容師特別喜歡它,因為你抓住了這種可愛的諾維茨梗犬的精髓。對于那些質(zhì)疑相關性的人來說,它們是最小的工作犬(正如我所說),小巧、快速、輕便,就像WebAssembly 一樣。為了深入了解各種WebAssembly 用例,我采訪了我在整個過程中提到的項目和公司的幾個成員。我要依次向Tim McCallum、Aaron Turner、Connor Hicks、Liam Randall、Kevin Hoffman、Sasha Krsmanovic、Jér?me Laban 和Francois Tanguay 表示感謝。技術評審員給了我寶貴的時間和反饋。我要感謝Sam Bail 博士、Taylor Poindexter、Hannah Thoreson、Brooks Townsend、Jay Phelps、David Sletten和無與倫比的Venkat Subramaniam 博士。早在2017 年,No Fluff Just Stuff 系列會議的Jay Zimmerman 就給了我一個場地,讓我開始專業(yè)的演講WebAssembly。他和我都知道這為時過早,但我們想開始對話,我很感激這個機會。這個非凡的技術嘉年華的其他演講者和參與者給了我無盡的靈感和反饋,為此我更富有。我的朋友和家人一直在鼓勵和支持我,這是我永遠無法償還的。我的妻子和朋友克里斯。↘ristin)做得尤其多。在全球爆發(fā)流行病期間,她和我們的狗Loki 和Freyja,讓這次在家的時間不僅可以忍受,而且比我在旅途中的生活更豐富。謝謝你們。
Brian Sletten是一位受過藝術教育的自由職業(yè)的軟件工程師,專注于前沿技術。Brian的職業(yè)生涯融合了應用下一代解決方案和實際解決問題的能力。他了解WebAssembly的實際優(yōu)勢以及它徹底改變我們行業(yè)的潛力。他擁有威廉瑪麗學院的計算機科學專業(yè)的理學學士學位。
目錄
前言 1
第1 章 概述 7
1.1 WebAssembly 能給你帶來什么 7
1.2 Web 歷史 11
1.3 JavaScript 起源 12
1.4 Web 平臺的演變 14
1.5 Native Client 17
1.6 asm.js 19
1.7 WebAssembly 的興起 .22
第2 章 Hello, World(有點像) .25
2.1 WebAssembly 文本格式(Wat) 27
2.2 將Wat 轉(zhuǎn)換為Wasm 30
2.3 在Repl 中運行Wasm .33
2.4 在瀏覽器中運行Wasm 34
第3 章 WebAssembly 模塊 37
3.1 模塊的結構 38
3.2 了解模塊的組成 40
3.3 使用模塊工作 .44
3.4 將來對于ES6 模塊的支持 51
第4 章 WebAssembly 內(nèi)存 53
4.1 TypedArray 54
4.2 WebAssembly 內(nèi)存實例 .58
4.3 使用WebAssembly 內(nèi)存的API .62
4.4 最后,關于字符串 68
第5 章 使用C/C 和WebAssembly 75
5.1 使用C 函數(shù) .76
5.2 事情變得復雜了 86
5.3 C/C 和WebAssembly 95
5.4 最后,在WebAssembly 中的Hello, World! 102
第6 章 WebAssembly 的應用:瀏覽器中的遺留代碼 . 107
6.1 恰當?shù)腍ello, World! 108
6.2 移植第三方代碼 . 114
6.3 libsodium 129
第7 章 WebAssembly Table . 131
7.1 靜態(tài)鏈接與動態(tài)鏈接 132
7.2 在模塊中創(chuàng)建Table 對象 137
7.3 WebAssembly 中的動態(tài)鏈接 140
第8 章 WebAssembly 在服務端的應用 . 145
8.1 Node.js 的原生擴展 146
8.2 WebAssembly 和Node.js 151
8.3 供應鏈攻擊 154
8.4 WebAssembly 和Deno .155
8.5 展望未來.160
第9 章 WebAssembly 實戰(zhàn):TensorFlow.js 161
9.1 計算機硬件 162
9.2 Playground .164
9.3 TensorFlow.js 164
9.4 WebAssembly 后端 168
第10 章 Rust 173
10.1 Rust 簡介 .174
10.2 Rust 遇上WebAssembly 181
10.3 wasm-bindgen 185
10.4 瀏覽器內(nèi)外的代碼設計 193
第11 章 WebAssembly 的系統(tǒng)接口(WASI) 201
11.1 WebAssembly 的系統(tǒng)接口概述 .202
11.2 基于能力的安全性 212
11.3 更大的前景 .216
第12 章 擴展WebAssembly 平臺 221
12.1 WASI 運行時 .222
12.2 多返回值 227
12.3 引用類型 230
12.4 模塊鏈接 234
12.5 功能檢查 240
12.6 其他提案 243
第13 章 WebAssembly 和.NET . 245
13.1 .NET 和Wasmtime .246
13.2 Blazor 250
13.3 Uno 平臺 263
第14 章 使用AssemblyScript 和WebAssembly 269
14.1 絕對不是一個TypeScript 到WebAssembly 的編譯器 .272
14.2 一個簡單的例子 273
14.3 垃圾收集與AssemblyScript 運行時 279
14.4 AssemblyScript 標準庫 .280
14.5 AssemblyScript 加載器 .282
第15 章 WebAssembly 的應用:在云端和邊緣計算中 287
15.1 個人的小插曲 288
15.2 我們的行業(yè)在發(fā)展 289
15.3 Fastly Compute@Edge 294
15.4 Krustlet .297
15.5 Suborbital 298
15.6 WasmEdge 299
15.7 wasmCloud .303
第16 章 WebAssembly 的應用:去中心化應用 . 309
16.1 中心化和去中心化 309
16.2 從比特幣到以太坊 311
16.3 如何解決類似停頓問題的難題 313
16.4 ewasm 316
16.5 Polkadot 318
16.6 星際文件系統(tǒng)(IPFS) 319
第17 章 WebAssembly 和其他語言 329
17.1 TinyGo 330
17.2 Artichoke .336
17.3 Swift 337
17.4 Java .341
17.5 Kotlin .344
17.6 Zig 344
17.7 Grain 348
17.8 接下來 349
附錄 安裝WebAssembly 工具 351