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
WebAssemblyでオセロを作ってみた
Search
t-yng
October 12, 2021
Technology
440
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WebAssemblyでオセロを作ってみた
t-yng
October 12, 2021
More Decks by t-yng
See All by t-yng
ChatGPTを活用した英文添削アプリケーション個人開発.pdf
tyng
0
84
型からモックデータ生成コードを自動生成する
tyng
0
57
GASで始めるサーバーレス 頑張らない社内アプリケーション開発
tyng
1
330
Other Decks in Technology
See All in Technology
【セミナー資料】Claude Code をセキュアに使うための考え方と設定の勘どころ / Claude Code Webinar 20260616
masahirokawahara
2
460
[AWS Summit Japan 2026]迷っているあなたへ_小さな一歩が、やがて自分を助けてくれる
sh_fk2
2
400
Multi-Agent並列開発を 安全に回すための技術 / Technology for Safely Multi-Agent Parallel Development
tooppoo
0
130
徹底討論!ECS vs EKS!
daitak
3
1.7k
2026年6月23日 Syncable Tech + Start Python Club にて
hamukazu
0
150
現場のトークンマネジメント
dak2
1
190
BPaaSで進むAIオペレーションの現在地 AI実装が効く領域とスケーラビリティの選定と実装
kentarofujii
0
150
Microsoft のサポートとフィードバック総まとめ
murachiakira
PRO
0
110
事業会社における 機械学習・推薦システム技術の活用事例と必要な能力 / ml-recsys-in-layerx-wantedly-2026
yuya4
0
160
OTel × Datadog で 「AI活用」を計測し、改善に繋げる
shihochan
2
630
水を運ぶ人としてのリーダーシップ
izumii19
4
990
本当の”仕事”を手放せる未来が見えた
mu7889yoon
0
110
Featured
See All Featured
Ruling the World: When Life Gets Gamed
codingconduct
0
260
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
470
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
180
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
47
8.2k
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
140
Raft: Consensus for Rubyists
vanstee
141
7.6k
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.5k
The browser strikes back
jonoalderson
0
1.3k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
123
22k
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
210
Why You Should Never Use an ORM
jnunemaker
PRO
61
9.9k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
Transcript
WebAssemblyͰΦηϩΛ ࡞ͬͯΈͨ FukuokaJS 2021/10/12
ࣗݾհ ໊લ: ༄ ྙߒ @t-yng ॴଐ: גࣜձࣾϠϚοϓ Ԭྺ: 4ϲ݄ झຯ:
ཱྀߦɾөը ຯḩຯͷͭು͕͖
Φηϩ࡞ͷ͖͔͚ͬ
Web Assembly (Wasm) ͱʁ WebAssembly ࠷ۙͷΣϒϒϥβʔͰಈ࡞͠ɺ৽ͨͳػೳͱ େ෯ͳύϑΥʔϚϯε্Λఏڙ͢Δ৽͍͠छྨͷίʔυͰ͢ɻ جຊతʹهड़Ͱͳ͘ɺCɺC++ɺRust ͷਫ४ͷݴޠʹ ͱͬͯޮՌతͳίϯύΠϧରͱͳΔΑ͏ʹઃܭ͞Ε͍ͯ·͢ɻ
Web Assembly ͱԿ͔ | MDN ɾϒϥβͰߴʹಈ࡞͢Δ ɾCɺRust ͳͲͷଞͷݴޠ͔ΒίϯύΠϧՄೳ ɾҰ෦ͷॏ͍ॲཧ͚ͩΛ Wasm ͰߴԽ͕Մೳ
Wasm JavaScript ΑΓߴʹಈ࡞͢ΔΒ͍͠ ͲΕ͚ͩߴԽ͞ΕΔ͔ମײͯ͠Έ͍ͨ forϧʔϓΛճͯ͠ൺֱͩͱ࣮ײͮ͠Β͍
ΦηϩͷCPUΛ JavaScript ͱ Wasm Ͱ ͦΕͧΕ࣮ߦͯ͠ൺֱΛͯ͠ΈΑ͏ʂ
ͬͯΈͨ
IUUQTXBTNPUIFMMPUZOHKQ
ಈ࡞Πϝʔδ +BWB4DSJQU Φηϩͷج൫ JavaScript Ͱ࣮ CPUΛ JavaScript ͱ Rust Ͱ࣮
JavaScript൛ ͱ Wasm൛ ͷΓସ͕͑Մೳ Γସ͑Մೳ
ΑΓNखઌΛ୳ࡧ͢Δ͜ͱͰਫ਼্͕͕Δ ୳ࡧͷਂ͞ʹԠͯ͡രൃతʹܭࢉ͕࣌ؒ૿͑Δ ॲཧ͕ૣ͘ͳΔ = ୳ࡧൣғ͕͕Δ = ڧ͍CPU ϛχϚοΫε๏ʹΑΔCPUͷ࣮
ܭଌ݁Ռ खઌ·Ͱܭࢉͨ͠ࡍͷ݁Ռ +BWB4DSJQUT 8BTNT dഒͷࠩ
WasmͷϏϧυͱ࣮ߦ ʢRustʣ
wasm-pack ɾRustͷίʔυΛjsͰಡΈࠐΈՄೳͳwasmʹίϯύΠϧ͢Δ ɾnpm͚ʹwasmΛύοέʔδϯά͢ΔࣄͰ͖Δ ɾTypeScriptͷܕఆٛϑΝΠϧҰॹʹੜͯ͘͠ΕͨΓ͢Δ Cargo ɾRustͷύοέʔδཧπʔϧ wasm-packͷΠϯετʔϧ $ cargo install
wasm-pack ※ Rustͷ։ൃڥηοτΞοϓલఏ
wasmͷϓϩδΣΫτ࡞ $ cargo new --lib wasm . ᵓᴷ package.json └─
wasm ᵓᴷ Cargo.toml └─ src └─ lib.rs ͜͜ʹ࣮Λॻ͍͍ͯ͘
RustΛ࣮ͯ͠ΈΔ extern crate wasm_bindgen; use wasm_bindgen::prelude::*; #[wasm_bindgen] pub fn add(a:
i32, b: i32) -> i32 { a + b; } #[wasm_bindgen] Ͱ JavaScript͔Β add ؔΛݺͼग़͠ Մೳʹ͢Δ
Cargo.tomlͷઃఆ [package] name = "wasm" version = "0.1.0" edition =
"2018" [lib] crate-type = ["cdylib"] [dependencies] wasm-bindgen="0.2" Cargo.toml: CargoͷઃఆϑΝΠϧ (package.jsonΈ͍ͨͳϞϊ) ɾlibͷλΠϓΛ cdylib ʹઃఆ͢Δ ɾdependencies ʹ wasm-bindgen ΛՃ
WasmʹίϯύΠϧ͢Δ $ wasm-pack build wasm ../src/lib/wasm TSDMJCST XBTN@CHKT XBTN@CH XBTN
XBTN@CH XBTNEUT XBTNKT XBTNEUT QBDLBHFKTPO Ϗϧυ
WasmʹίϯύΠϧ͢Δ . ᵓᴷ package.json ᵓᴷ src │ɹ └─ lib │ɹɹ
└─ wasm │ɹɹɹɹ ᵓᴷᴷ package.json │ ɹɹɹɹ ᵓᴷᴷ wasm.d.ts │ ɹɹɹɹᵓᴷᴷ wasm.js │ɹɹɹɹ ᵓᴷᴷ wasm_bg.js │ ɹɹɹɹᵓᴷᴷ wasm_bg.wasm │ ɹɹɹɹᵋᴷᴷ wasm_bg.wasm.d.ts └─ wasm ɹɹᵓᴷ Cargo.toml ɹɹ └─ src ɹɹɹ ɹᵋᴷ lib.rs XBTNQBDLͰ Ϗϧυͨ͠Ռ
Next.jsͰϑϩϯτΤϯυΛߏங . ᵓᴷ package.json ᵓᴷ next.con fi g.js ᵓᴷ src
│ ᵓᴷ lib │ ɹᴹ ɹ └─ wasm │ └─ pages │ ɹɹᵋᴷ index.jsx └─ wasm $ yarn install next react react-dom Next.jsΛ͏͜ͱͰ࠷খߏͰWasmΛࢼ͢͜ͱ͕Ͱ͖Δ ࣍εϥΠυͰ࡞༧ఆ ࣍εϥΠυͰ࡞༧ఆ
Next.con fi g.js Λઃఆ // next.con fi g.js module.exports =
{ webpack(config) { // next build Λ͢Δ߹͜Ε͚ͩͩͱμϝ config.experiments = { asyncWebAssembly: true }; return config; }, }; $ touch next.con fi g.js
src/pages/index.js Λ࣮ import { add } from "../lib/wasm/wasm_bg"; const IndexPage
= () => { return <button onClick={() => alert(add(10, 20))}>͠ࢉ</button>; }; export default IndexPage; Webpack5 Ͱ wasmͷಡΈࠐΈΛαϙʔτ͍ͯ͠Δ WebAssembly.instantiateStreaming Λͬͯ wasm ΛಡΈ ࠐΉܗࣜʹมͯ͘͠Ε͍ͯΔ XFCQBDLFYBNQMFTXBTNTJNQMF $ mkdir -p src/pages && touch src/pages/index.jsx
࣮ߦ $ yarn dev
ɾWasmͷ࣮ߦ͕ମײͰ͖ͯྑ͔ͬͨ ɾWasmͷϏϧυࢼ͚ͩ͢ͳΒࢥͬͨΑΓ؆୯ ɾ࣮Ͱ͏ػձ·ͩগͳͦ͏ ɹɾϑϩϯτΤϯυͰॏ͍ͨॲཧ͕ඞཁͳ໘ ɹɹ·ͩগͳ͍ҹ ·ͱΊ