Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Rust+WebAssemblyをさわってみた話 / rust-webassembly
Search
USAMI Kosuke
December 09, 2022
Programming
0
730
Rust+WebAssemblyをさわってみた話 / rust-webassembly
※ Docswell に移行しました
https://www.docswell.com/s/usami-k/ZM1Y1L-rust-webassembly
USAMI Kosuke
December 09, 2022
Tweet
Share
More Decks by USAMI Kosuke
See All by USAMI Kosuke
Onsager代数とその周辺 / Onsager algebra tsudoi
usamik26
0
650
Apple HIG 正式名称クイズ結果発表 / HIG Quiz Result
usamik26
0
190
ゆめみ大技林製作委員会の立ち上げの話 / daigirin project
usamik26
0
340
@ViewLoadingプロパティラッパの紹介と自前で実装する方法 / @ViewLoading property wrapper implementation
usamik26
0
490
これからUICollectionViewを実践活用する人のためのガイド / Guide to UICollectionView
usamik26
1
760
Xcodeとの最近の付き合い方のはなし / Approach To Xcode
usamik26
2
680
UICollectionView Compositional Layout
usamik26
0
800
Coding Swift with Visual Studio Code and Docker
usamik26
0
520
Swift Extension for Visual Studio Code
usamik26
2
1.1k
Other Decks in Programming
See All in Programming
フロントエンドのmonorepo化と責務分離のリアーキテクト
kajitack
2
160
「手軽で便利」に潜む罠。 Popover API を WCAG 2.2の視点で安全に使うには
taitotnk
0
580
Azure SRE Agentで運用は楽になるのか?
kkamegawa
0
1.3k
CJK and Unicode From a PHP Committer
youkidearitai
PRO
0
100
TanStack DB ~状態管理の新しい考え方~
bmthd
2
450
機能追加とリーダー業務の類似性
rinchoku
2
700
testingを眺める
matumoto
1
130
実用的なGOCACHEPROG実装をするために / golang.tokyo #40
mazrean
1
180
旅行プランAIエージェント開発の裏側
ippo012
2
810
時間軸から考えるTerraformを使う理由と留意点
fufuhu
12
4k
1から理解するWeb Push
dora1998
3
1.3k
モバイルアプリからWebへの横展開を加速した話_Claude_Code_実践術.pdf
kazuyasakamoto
0
300
Featured
See All Featured
Large-scale JavaScript Application Architecture
addyosmani
512
110k
Building an army of robots
kneath
306
46k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
507
140k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
46
7.6k
Learning to Love Humans: Emotional Interface Design
aarron
273
40k
Rails Girls Zürich Keynote
gr2m
95
14k
Java REST API Framework Comparison - PWX 2021
mraible
33
8.8k
For a Future-Friendly Web
brad_frost
179
9.9k
Music & Morning Musume
bryan
46
6.8k
Automating Front-end Workflow
addyosmani
1370
200k
Balancing Empowerment & Direction
lara
3
610
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
48
9.7k
Transcript
Rust+WebAssemblyを さわってみた話 宇佐見公輔 2022-12-09
自己紹介 宇佐見公輔(うさみこうすけ) 株式会社ゆめみ / iOSテックリード 大阪在住、最寄のゆめみオフィスは京都 KyotoLT参加2回目 Rust+WebAssemblyをさわってみた話 / 宇佐見公輔
2
Rust+WebAssembly Rustから見た場合 Rust言語の活用方法のひとつとして RustでWebフロントエンド開発ができる WebAssemblyから見た場合 WebAssembly形式を生成する手段のひとつとして コンパクトかつ高パフォーマンスなwasmバイナリを生成できる Rust+WebAssemblyをさわってみた話 / 宇佐見公輔
3
WebAssemblyとは Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 4
WebAssemblyとは Webブラウザー上で実行できるバイナリ形式 かつてJavaもやっていたが…… ブラウザーに組み込まれた仮想マシン上で実行される JavaScriptも仮想マシン上で実行される WebAssemblyのほうが高速に動作する Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 5
JavaScriptとWebAssembly 両者を併用する WebAssemblyですべてをカバーはできない WebAssemblyでJavaScriptを補強する JavaScriptからWebAssemblyの関数を呼び出せる WebAssemblyからJavaScriptの関数を呼び出せる Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 6
WebAssemblyの事例 Google Meet Google Earth Figma eBay など…… Rust+WebAssemblyをさわってみた話 /
宇佐見公輔 7
WebAssemblyバイナリ Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 8
WebAssemblyバイナリ magic ::= 0x00 0x61 0x73 0x6D version ::= 0x01
0x00 0x00 0x00 (参考:ELFバイナリだと先頭4バイトは 0x7F 0x45 0x4C 0x46 ) Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 9
WebAssemblyバイナリの生成方法 WebAssemblyテキストを記述して生成する C/C++ソースコードからEmscriptenで生成する Rustソースコードからwasm-packで生成する AssemblyScriptソースコードから生成する Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 10
WebAssemblyテキスト WABT(WebAssembly Binary Toolkit)でバイナリに変換 wat2wasm simple.wat -o simple.wasm (module (func
$i (import "imports" "imported_func") (param i32)) (func (export "exported_func") i32.const 42 call $i ) ) Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 11
Emscripten C/C++コンパイラの代わりにEmscriptenコンパイラを使う emcc hello.c -o hello.html (wasm、js、htmlを生成) #include <stdio.h> int
main() { printf("Hello World\n"); return 0; } Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 12
Rust wasm-pack cargo buildの代わりにwasm-packツールでビルドする wasm-pack build --target web (wasm、jsを生成) use
wasm_bindgen::prelude::*; #[wasm_bindgen] pub fn greet(name: &str) { alert(&format!("Hello, {}!", name)); } Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 13
AssemblyScript TypeScriptのサブセット AssemblyScriptはWebAssemblyにコンパイルされる asc sample.ts --outFile sample.wasm 対比:TypeScriptはJavaScriptにトランスパイルされる tsc sample.ts
--outFile sample.js Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 14
RustでWebAssemblyバイナリを生成 Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 15
環境準備 Rust環境の準備 rustup で rustc や cargo のインストール wasm-pack導入 cargo
install wasm-pack Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 16
プロジェクト作成 プロジェクト作成 cargo new --lib Cargo.toml 設定 [lib] crate-type =
["cdylib"] [dependencies] wasm-bindgen = "0.2" Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 17
RustからJavaScriptの関数を呼ぶ #[wasm_bindgen] extern { pub fn alert(s: &str); } これで
alert がRustから呼べるようになる alert はJavaScriptで提供される関数 Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 18
JavaScriptからRustの関数を呼ぶ #[wasm_bindgen] pub fn greet(name: &str) { alert(&format!("Hello, {}!", name));
} これで greet がJavaScriptから呼べるようになる greet はRustで実装した関数 先ほどの alert をRustで使っている Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 19
WebAssemblyのビルド wasm-packでビルド wasm-pack build --target web 生成物 WebAssemblyバイナリ JavaScriptファイル(WebAssemblyのラッパー) Rust+WebAssemblyをさわってみた話
/ 宇佐見公輔 20
WebAssemblyのロード <body> <script type="module"> import init, {greet} from "./pkg/hello_wasm.js"; init()
.then(() => { greet("WebAssembly") }); </script> </body> Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 21
Webサーバーの準備と実行 MIMEタイプ application/wasm に対応したWebサーバーの準備 python3 -m http.server で良い Webブラウザーでアクセス http://localhost:8000
うまくいけばアラートボックスが表示される Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 22
より実践的なチュートリアル Conwayのライフゲーム The Rust Wasm Book https://rustwasm.github.io/docs/book/ Rust+WebAssemblyをさわってみた話 / 宇佐見公輔
23
情報源 WebAssembly | MDN Web Docs https://developer.mozilla.org/ja/docs/WebAssembly Rust and WebAssembly
Documentation https://rustwasm.github.io/docs.html 入門WebAssembly(Rick Battagline、翔泳社) Rust+WebAssemblyをさわってみた話 / 宇佐見公輔 24