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
450
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
86
型からモックデータ生成コードを自動生成する
tyng
0
59
GASで始めるサーバーレス 頑張らない社内アプリケーション開発
tyng
1
330
Other Decks in Technology
See All in Technology
TypeScript入門 2026
recruitengineers
PRO
2
490
【CEDEC2026】グラフィックスエンジニアのためのニューラルシェーディング入門
cygames
PRO
0
120
AWS ネットワーク構築でハマった(ハマりかけた) 5選とそこから得た教訓
nagisa53
4
190
Contract One Engineering Unit 紹介資料
sansan33
PRO
0
19k
第3回しろおびセキュリティスポンサーセッション
log0417
0
160
Software Supply Chain Attackからクラウド環境を守るためにできること
lhazy
2
220
[しろおび夏祭り2026] チャットするAIから、作業するAIへ - 使われ方の変化と、その裏側で起きていること
kk0n
0
1.7k
20260807_第6回_関東kaggler会LT_claw系bot xangiと始める、"寂しくない" kaggle
sugupoko
0
200
生成 AI の基礎 〜 サンプル実装で学ぶ基本原理
enakai00
7
4.4k
【CEDEC2026】『Relink』を拡張せよ - 『GRANBLUE FANTASY: Relink - Endless Ragnarok』の開発速度と品質を守るCI運用
cygames
PRO
0
140
Issue設計から始める仕様駆動開発 / 20260731 Mizuki Hirata
shift_evolve
PRO
1
150
toio・myCobotでフィジカルAIっぽいことを行うための検討(とりあえず調査) / フィジカルAI LT(IoTLTによる開催)
you
PRO
0
300
Featured
See All Featured
Building Better People: How to give real-time feedback that sticks.
wjessup
370
20k
Amusing Abliteration
ianozsvald
1
240
sira's awesome portfolio website redesign presentation
elsirapls
0
320
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
330
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
230
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Music & Morning Musume
bryan
47
7.3k
Exploring anti-patterns in Rails
aemeredith
3
460
DBのスキルで生き残る技術 - AI時代におけるテーブル設計の勘所
soudai
PRO
68
56k
Marketing Yourself as an Engineer | Alaka | Gurzu
gurzu
0
270
Producing Creativity
orderedlist
PRO
348
40k
Conquering PDFs: document understanding beyond plain text
inesmontani
PRO
4
2.9k
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ͷϏϧυࢼ͚ͩ͢ͳΒࢥͬͨΑΓ؆୯ ɾ࣮Ͱ͏ػձ·ͩগͳͦ͏ ɹɾϑϩϯτΤϯυͰॏ͍ͨॲཧ͕ඞཁͳ໘ ɹɹ·ͩগͳ͍ҹ ·ͱΊ