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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
Amplify Gen2でbackend.tsにCDKを定義する/しない事によるCDKの挙動の違いとユースケース
smt7174
1
400
AI時代の闇と光
tatsuya1970
0
110
脱金融のフューチャー・デザイン / Future Design Beyond Finance
ks91
PRO
0
160
Compose 新機能総まとめ / What's New in Jetpack Compose
yanzm
0
320
AIが実装を自走する時代の認知負債との戦い
lycorptech_jp
PRO
0
160
OPENLOGI Company Profile for engineer
hr01
1
74k
しくみを学んで使いこなそう GitHub Copilot app
torumakabe
2
290
Claude Code公式skillで 自分の仕事を少しずつ手放そう!(Claude Code開発ノウハウ大公開スペシャル by クラスメソッド)
kaym
1
480
SoccerMaster: A Vision Foundation Model for Soccer Understanding
kzykmyzw
0
140
Making sense of Google’s agentic dev tools
glaforge
1
280
Control Planeで育てるBtoB SaaSの認証基盤 - SRE NEXT 2026
pokohide
1
2.6k
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
15
110k
Featured
See All Featured
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
62
45k
The Curse of the Amulet
leimatthew05
2
13k
How to make the Groovebox
asonas
2
2.3k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
240
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.9k
Test your architecture with Archunit
thirion
1
2.3k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.4k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
410
Measuring & Analyzing Core Web Vitals
bluesmoon
9
880
Skip the Path - Find Your Career Trail
mkilby
1
170
Jamie Indigo - Trashchat’s Guide to Black Boxes: Technical SEO Tactics for LLMs
techseoconnect
PRO
0
360
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ͷϏϧυࢼ͚ͩ͢ͳΒࢥͬͨΑΓ؆୯ ɾ࣮Ͱ͏ػձ·ͩগͳͦ͏ ɹɾϑϩϯτΤϯυͰॏ͍ͨॲཧ͕ඞཁͳ໘ ɹɹ·ͩগͳ͍ҹ ·ͱΊ