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
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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
62
GASで始めるサーバーレス 頑張らない社内アプリケーション開発
tyng
1
340
Other Decks in Technology
See All in Technology
Introduction to Sansan for Engineers / エンジニア向け会社紹介
sansan33
PRO
6
77k
1000⼈規模のClaude Enterprise運⽤を「Oktaのグループ」と「Slack」に集約する
sansantech
PRO
0
490
研究開発部の紹介 / Sansan R&D Profile
sansan33
PRO
4
24k
現場の暗黙知を継承するAIエージェント — 対話から生まれる長期記憶と Skills
atsukish
0
130
「面白い!」を信じ抜け。激動の時代を貫く、オンリーワン・エンジニアの条件
kizawa2020
1
370
AI駆動開発をチームに根付かせる - 「1行も書かない」チームがHarnessを育てた1年 -
kenichirokimura
6
3.3k
Cloudflare製品を活用した AIガバナンス実践入門 / AI governance with Cloudflare Service
delta_tech
1
120
顧客の要望は2次情報である 〜アンテナを張るFDEの構造論〜
noriakioji
5
1k
VPCでもFloatingIPを使いたいんだ
y_kotani
1
120
アクセスキー流出時の対応で再認識した攻撃側と防御側の非対称性について
kazzpapa3
0
430
名刺メーカーDevグループ 紹介資料
sansan33
PRO
0
1.2k
わたしが知り合いゼロの勉強会に 行けるようになるまで
r5ni4
2
830
Featured
See All Featured
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
56
3.4k
The SEO identity crisis: Don't let AI make you average
varn
0
540
Code Reviewing Like a Champion
maltzj
528
40k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Six Lessons from altMBA
skipperchong
29
4.5k
Making Projects Easy
brettharned
120
6.7k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
VelocityConf: Rendering Performance Case Studies
addyosmani
331
25k
Ethics towards AI in product and experience design
skipperchong
2
350
Fireside Chat
paigeccino
42
4k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
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ͷϏϧυࢼ͚ͩ͢ͳΒࢥͬͨΑΓ؆୯ ɾ࣮Ͱ͏ػձ·ͩগͳͦ͏ ɹɾϑϩϯτΤϯυͰॏ͍ͨॲཧ͕ඞཁͳ໘ ɹɹ·ͩগͳ͍ҹ ·ͱΊ