回顧 2018 年的 Rust 和 WebAssembly
🎉 2018 年版的 Rust 正式發布,同時也帶來了最初的 Rust 和 WebAssembly 開發故事!🎉
為了了解我們進展了多少,讓我們回顧一年前 Rust 和 WebAssembly 的故事:rustc
可以發射 WebAssembly 二進制檔給您,但這只是技術的初步版本。就與 JavaScript 的溝通而言,您必須自行處理 raw wasm 輸入和輸出。這表示您只能傳遞 32-bit 和 64-bit 整數和浮動數字。Rust 結構、JavaScript 物件、字串或片段不能傳遞到彼此之間。而且,要散佈您的函式庫的 .wasm
,以便其他的下游專案可以依賴它?祝您好運。
儘管情況是 Rust 和 WebAssembly 有巨大的潛力,這是很明顯的
,但沒有人確切知道這代表什麼。因此當 Rust 和 WebAssembly 專案組成立時,我們團結一心,致力實現這個共同的願景
編譯 Rust 到 WebAssembly 應該是為網際網路提供快速、可靠程式碼的最佳選擇。
隨著我們的想法演進,我們提煉出另一個核心價值
Rust 和 WebAssembly 在這裡是用來擴充您的 JavaScript,而不是取代它。
Rust 整合 C 函式庫和在原生目標上的呼叫約定後,它應該可以在網際網路上順利使用 JavaScript 和 HTML5 API。您不需要完全重新寫入整個網際網路應用程式或 JavaScript函式庫。我們無法實現 Rust 和 wasm 的願景,如果這意味著您必須從頭開始,那是不可行的。
有了這些共同的價值和願景,我們設定了 Rust 2018 發布前,我們想要的 Rust 和 WebAssembly 生態系統、工具鏈和工作流程目標。
目標:☑ 零成本的 JavaScript 互操作性
Rust 透過運用零成本抽象來使快速和表達性的程式碼得以實現。我們希望將此原則應用於我們的整體 JS 互操作基礎設施。沒錯,您可以撰寫自己的樣板程式碼,將 DOM 節點傳遞至 Rust 產生的 wasm,但您不應該這麼做,而提供的基礎設施應該像您手動 編寫程式碼時一樣快速。如果您呼叫 IndexedDB API,那不應該讓您的 .wasm
二進制檔膨脹,讓它載入未使用的 Web GL 函數繫結。
我們建立了 wasm-bindgen
作為零成本 JavaScript 相互運作的基礎。 wasm-bindgen
簡化了 JavaScript 與 WebAssembly 之間的溝通,並產生您原本必須自己編寫的粘合程式碼。在 wasm-bindgen
之上,我們建立了 js-sys
(與 ECMAScript API 的原始繫結)和 web-sys
(與 Web API 的原始繫結)。
透過使用 wasm-bindgen
生態系統,我們可以輕鬆、有效率地
- 從我們由 Rust 產生的 wasm 函式庫匯出豐富的 API,因此可以從 JavaScript 中呼叫,以及
- 將 JavaScript 和 Web API 匯入到由 Rust 產生的 wasm 中。
完全免費。
<此外, wasm-bindgen
與 WebAssembly 主機繫結提案 相容。主機繫結會移除存在於 wasm 函式和 DOM 方法之間的小型已產生 JavaScript shim 函式。最後,主機繫結承諾解鎖比 JavaScript 還要快的 DOM 存取,因為呼叫可以一次靜態驗證,而非每次都會動態檢查。
目標:☑ 將由 Rust 產生的 Wasm 分發成 NPM 函式庫
絕佳的整合不僅是關於匯出及匯入由 Rust 產生 WebAssembly 和 JavaScript 之間的功能。也能放入 JavaScript 的分發機制中,而這部份的主要功臣是 NPM。
我們 建立了 wasm-pack
,目的是讓您可以輕易地從 Rust 和 WebAssembly 程式碼建立及發佈 NPM 套件。在過去,完全沒有任何管道可以分享由 Rust 產生的 wasm 模組。現在,您只需要
wasm-pack publish
目標:☑ 讓開發人員能快速寫出具有生產力的作品
我們寫了 一本 Rust 和 WebAssembly 書籍,向您介紹 WebAssembly 與 Rust 開發的一切內外細節。內含 一個教學課程讓您建立康威生命遊戲的實作,然後您將學習如何為無頭瀏覽器撰寫測試、在出錯時除錯 wasm 程式碼、以及如何診斷慢速的程式碼路徑,然後加速它們。
我們意識到,在 cargo
和 rustc
發出初始 .wasm
二進位檔案後,您會想要執行許多「後建置」工具。為了好用性和開發人員的生產力,我們將 wasm-pack
的角色從建立和發佈 NPM 套件擴展到編制所有這些工作。 wasm-pack
將會管理 wasm-bindgen
CLI 二進位檔案,並為您自動安裝瀏覽器的 WebDriver 程式。
例如,您想在無頭 Firefox 瀏覽器中執行測試嗎?只要執行
wasm-pack test --headless --firefox
不用再抓著頭髮想辦法去安裝和設定某些東西!
最後,我們了解到建立 Rust 和 WebAssembly 專案最初會涉及設定樣板和組態這個有點蠢的事,新使用者不方便準備,有經驗使用者不想浪費時間處理。因此,我們為不同的使用狀況建立了各種專案範本,讓您可以立即開始執行
wasm-pack-template
用於建立使用 Rust 和 Wasm 的 NPM 函式庫。create-wasm-app
用於建立建立在 Rust 生成的 wasm NPM 函式庫上方的網頁應用程式。rust-webpack-template
用於建立結合 Rust、WebAssembly 和 Webpack 綑綁器的完整網頁應用程式。rust-parcel-template
用於建立結合 Rust、WebAssembly 和 Parcel 綑綁器的完整網頁應用程式。
目標:☑ Rust 生成的 Wasm 應該可供測試和除錯
我們了解測試和除錯基礎架構是建立可靠程式碼和提升開發人員生產力的基本條件。
預設上,wasm 無法記錄任何意外或錯誤,因為它沒有任何「系統呼叫」或 I/O 功能。您必須自行新增這類項目的匯入,然後使用適當的函式實例化模組。為了解決這個問題並確保意外總是可以除錯,我們建立了 the console_error_panic_hook
crate,將意外訊息重新導向至瀏覽器的開發人員工具主控台。
儘管您總是可以針對可攜式、與平台無關的程式碼在原生目標上執行正規 #[test]
測試,但這不足以測試您的函式庫與 DOM、非同步 JavaScript 承諾或事件處理常式的互動。因此,我們建立了 the wasm-bindgen-test
基礎架構,而且讓您使用 wasm-pack test
可以輕易安裝和組態無頭瀏覽器和 Node.js 測試所需的二進位檔。
我們也體驗過找出程式碼大小來源這件事在使用 WebAssembly 時很困難。我們想了解例如哪個函式呼叫了另一個函式,導致它會包含在 .wasm
二進位檔中,因此我們建立了 the Twiggy🌱 WebAssembly 程式碼大小 Profiler。
Shallow Bytes │ Shallow % │ Retaining Paths
───────────────┼───────────┼───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────
152 ┊ 5.40% ┊ wee_alloc::alloc_with_refill::hb32c1bbce9ebda8e
┊ ┊ ⬑ func[2]
┊ ┊ ⬑ <wee_alloc::size_classes::SizeClassAllocPolicy<'a> as wee_alloc::AllocPolicy>::new_cell_for_free_list::h3987e3054b8224e6
┊ ┊ ⬑ func[5]
┊ ┊ ⬑ elem[0]
┊ ┊ ⬑ hello
┊ ┊ ⬑ func[8]
┊ ┊ ⬑ export "hello"
#RustWasm2019
我們的目標都集中在我們與 2018 年版本同步提供的事物上。但現在,由於 2018 年版本已經發行,該是時候考慮我們在 2019 年及其之後想達成什麼了。
這正是您的進場時機!
遵循大型 Rust 專案的 傳統,我們要求社群撰寫部落格文章回顧 2018 年的 Rust 和 WebAssembly,並提出 Rust 和 WebAssembly 在 2019 年的目標和方向。我們會閱讀所有內容,然後提出一個 RFC,作為 Rust 和 WebAssembly 領域工作小組在 2019 年的路線圖。
在您選擇的寫作平台上寫下您的想法。它可以是
- 您的個人或公司部落格
- GitHub gist
- Medium 貼文
- 您的任何偏好平台
我們正在尋找有關許多不同主題的文章
- 社區計畫的想法
- 工具增強
- 生態系和函式庫需求
- 文件改進
- 任何與 Rust 和 Wasm 相關的內容!
使用 主題標籤 #RustWasm2019
發佈您的寫作,或在 這個 github 問題 上放置連結。我們會在這個部落格上發布另一篇大文章中彙整所有人的寫作。然後,Rust 和 WebAssembly 工作小組核心團隊將閱讀所有文章,並為工作小組 2019 年的路線圖撰寫一個 RFC!此 RFC 將遵循我們的正常 RFC 流程,所有人都有機會討論、改進和幫助完善它。
初步時程
- 即日起至 1 月 15 日:分享您的
#RustWasm2019
文章,閱讀其他人發布的文章,與他們討論、激盪想法。 - 1 月底:我們將正式提出 2019 年路線圖 RFC,然後作為一個社群一起透過 RFC 流程來執行它。
- 2 月底:我們希望在 2 月底之前就 2019 年路線圖達成共識,並合併 RFC。
謝謝大家 2018 年的精彩表現! 💖
感謝每一位在 2018 年對 Rust 和 WebAssembly 有所貢獻的人!(如果這個清單中少了任何人,我們深感抱歉!)
- 0xazure
- Aaron Turon
- Aditya Arora
- Aidan Hobson Sayers
- Aleksey Kladov
- Alex Crichton
- Alex Macleod
- Alexander Kryvomaz
- Alfie John
- Anders Pitman
- Andrew Champion
- Andrew Chin
- Andy Bell
- Anna Bogus
- Anton Danilkin
- Ashley Williams
- Ben Merritt
- Benjamin Kampmann
- Blixt
- Bradlee Speice
- Cameron Taggart
- Camille TJHOA
- Chinedu Francis Nwafili
- Chris Goller
- Chris Kolodin
- Christian Bourjau
- Christopher Lane Hinson
- Cldfire
- Corbin Uselton
- Corey Farwell
- Craig Disselkoen
- Dan Fockler
- Dan Reeves
- Daniel Gollahon
- Daniele Esposti
- Danielle Pham
- Darren Tsung
- David Flemström
- David McNeil
- David O’Connor
- DebugSteven
- Dimitrii Nemkov
- Dmitry Kashitsyn
- Eduard Kyvenko
- Erick Tryzelaar
- Erika Kloss
- Evan Shaw
- Felix Schütt
- Florian Gilcher
- Frank Hassanabad
- Frazer McLean
- Gergely Nagy
- Guy Waldman
- Hendrik Sollich
- Henrik Sjööh
- Herman J. Radtke III
- Hidehito Yabuuchi
- Ian Duke
- Ian McIntyre
- Ingvar Stepanyan
- Ioannis Valasakis
- Ivan Enderlin
- J. Ryan Stinnett
- Jamen Marz
- Jamie Kyle
- Jan Willem Henckel
- Jan-Erik Rediger
- Jannik Keye
- Jason Davies
- Jason Wohlgemuth
- Jesper Håkansson
- Jim Blandy
- Joel Gallant
- Johann Hofmann
- Johannes Henninger
- John Lewis
- Jonas Trollvik
- Jonathan Kingston
- Jonathan Sundqvist
- Josh Triplett
- Joshua Liebow-Feeser
- Joshua Sheard
- Josmar Dias
- João Lucas Lucchetta
- Julius Rakow
- Junjie Huang
- Katharina Fey
- Kevin Hoffman
- Kirill Bulatov
- Kyle Lin
- Lachezar Lechev
- Laurentiu Nicola
- Liigo Zhuang
- LongYinan
- Luke Wagner
- Mackenzie Clark
- Mackiovello
- Manas Karekar
- Marcin Baraniecki
- Mario Reder
- Mark Andrus Roberts
- Mark Hintz
- Markus Stange
- Mason Stallmo
- Matias Insaurralde
- Matt Harrison
- Matt Howell
- Matt Kraai
- Matt Long
- MaxD / vj userZero
- MaxXor
- Michael Gattozzi
- Michael Gerhaeuser
- Michael Hoffmann
- Mirclus
- Nathan Froyd
- Nick Fitzgerald
- Nik Graf
- Nikolay Volf
- Noah Lemen
- Noumir Poutipou
- OJ Kwon
- Pascal Brandt
- Pascal Hertleif
- Pat Hickey
- Peter Trotman
- R. Andrew Ohana
- Rahul Sharma
- Ralph Giles
- Renée Kooi
- Ricardo Ambrogi
- Richard Dodd (dodj)
- Robert Masen
- Roberto Huertas
- Rongjian Zhang
- Ruben Schmidmeister
- Ryan Levick
- Sallar Kaboli
- Santiago Pastorino
- Satoshi Amemiya
- Scott Johnson
- Sebastian Köln
- Sendil Kumar N
- Sergey Pepyakin
- Sharad Chand
- Sonny Scroggin
- Sophie Alpert
- Spencer Wilson
- Stefan Novak
- Stefan Zimmermann
- Stephan Renatus
- Stephan Wolski
- Steve Klabnik
- Sven Sauleau
- T. Nagasawa
- Tao He
- Ted Mielczarek
- Theemathas Chirananthavat
- Thiago Pontes
- Thomas Eizinger
- Tim Ryan
- Tobias Bieniek
- Tomohide Takao
- Tomáš Hübelbauer
- Tyler Laing
- Tyler Wilcock
- William Lundstedt
- YUyz
- Yoshua Wuyts
- Yury Delendik
- Yuval Kohavi
- Zachary Pierce
- Zack Pierce
- afdw
- alkahest
- andy-bell
- arjunyel
- ashley williams
- belfz
- bokuweb
- bspeice
- csmoe
- data-pup
- dependabot[bot]
- frankhassanbad
- gaurikholkar
- gnzlbg
- huangjj27
- janczer
- johnthagen
- kohensu
- konstin
- kryptan
- kzvi
- limira
- na-g
- pup
- robert masen
- robertdurst
- sarahmeyer
- sepiropht
- sigmaSd
- soryrawyer
- teovoinea
- toversus
- twilco
- xeqlol