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
58
GASで始めるサーバーレス 頑張らない社内アプリケーション開発
tyng
1
330
Other Decks in Technology
See All in Technology
SRE依存からの脱却 運用を開 発チームへ移す、 フルサイ クル開 発体制の実践
joooee0000
0
3.2k
非定型なドキュメントを効率よくリファクタする 〜えぇ!?仕様書27本の移行が1日で終わったって!?〜
subroh0508
2
560
[2026-07-15] AI Ready なはずだったアーキテクチャと、見えてきた課題・次に目指す状態
wxyzzz
9
4k
個人開発で育てる「大規模設計の苗床」 - AI時代の1人開発から始める業務への知識接続 / The Seedbed for Large-Scale Design - From AI-Era Solo Projects to Professional Knowledge
bitkey
PRO
1
280
穢れた技術選定について
watany
17
5.6k
LLMやAIエージェントをソフトウェアに組み込むプラクティス
shibuiwilliam
2
420
脱金融のフューチャー・デザイン / Future Design Beyond Finance
ks91
PRO
0
160
公式ドキュメントの歩き方etc
coco_se
1
120
“それは自分の仕事じゃない"を越えて行け
yuukiyo
1
480
AmplifyHostingConstructからSSRフレームワークのためのホスティング設計を考察する/amplify-hosting-construct
fossamagna
1
240
AIコード生成×サプライチェーン攻撃 — PHPが直面する“二重の信頼問題
shinyasaita
0
210
AI Driven AI Governance
pict3
0
490
Featured
See All Featured
Faster Mobile Websites
deanohume
310
32k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.5k
30 Presentation Tips
portentint
PRO
1
350
Ten Tips & Tricks for a 🌱 transition
stuffmc
0
150
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
260
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
240
A Soul's Torment
seathinner
6
3.1k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
470
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
530
The Director’s Chair: Orchestrating AI for Truly Effective Learning
tmiket
1
220
Discover your Explorer Soul
emna__ayadi
2
1.2k
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ͷϏϧυࢼ͚ͩ͢ͳΒࢥͬͨΑΓ؆୯ ɾ࣮Ͱ͏ػձ·ͩগͳͦ͏ ɹɾϑϩϯτΤϯυͰॏ͍ͨॲཧ͕ඞཁͳ໘ ɹɹ·ͩগͳ͍ҹ ·ͱΊ