Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Webアプリを高速化する WebAssembly
Search
Atsushi Nakatsugawa
PRO
June 12, 2019
Technology
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Webアプリを高速化する WebAssembly
Monaca UG TOKYO #9 〜先進的Web系技術を学ぶ〜
https://monacaug.connpass.com/event/131671/
の発表資料です。
Atsushi Nakatsugawa
PRO
June 12, 2019
More Decks by Atsushi Nakatsugawa
See All by Atsushi Nakatsugawa
開発を高速化。AIコーディングエージェントとCodeRabbitでループエンジニアリング
moongift
PRO
0
51
AIコーディングの次。コードレビューと理解負荷を解消して組織の開発生産性を高める
moongift
PRO
2
3k
AI駆動開発は個人技からチーム戦へ:組織でAIを使いこなすための実践設計
moongift
PRO
0
690
AI時代の開発生産性は、個人技からチーム設計へ
moongift
PRO
6
3.9k
コーディングだけ速くとも意味がない。自動レビューによる開発の高速化
moongift
PRO
0
150
AI 支援研究開発におけるコードレビューの役割と限界
moongift
PRO
0
200
個人AIからチームAIへ:開発における品質と生産性の再設計
moongift
PRO
0
530
AI活用の格差をなくす:チーム全体のAI開発生産性を底上げする方法
moongift
PRO
1
810
CodeRabbit 2026年04月アップデート
moongift
PRO
0
110
Other Decks in Technology
See All in Technology
AIエージェントを安全で速い現場監督にする:Jev・Obsidian・メタハーネス
x5gtrn
PRO
0
130
ScotSecure West 2026 - Glasgow
raybugg
0
190
HacobuにおけるFDEとは/登壇資料(戸井田 裕貴)
hacobu
PRO
1
120
その Lambda、8分で 管理者権限まで奪われます
k1nakayama
7
3.8k
PQC移行の今 -- IETF からみた現在地
satokan
4
480
人にやさしく、AIにやさしく、書き手を選ばないIaCのガードレール再考 / Rethinking IaC Guardrails for Humans and AI Alike
kohbis
5
1.3k
技術的負債から考える、AI時代のエンジニアリング投資 — ビズリーチの技術的負債と向き合った経験から、変更し続けられるソフトウェアを考える/ technical-debt-con2026
visional_engineering_and_design
4
3.9k
2026-09-08 そのJavaモダナイゼーション、AIに丸投げで大丈夫?IBM Bobで変わる品質と効率
yutanonaka
1
200
AIエージェントの一手は 誰も見ていない - Falco拡張OSS「Prempti」とeBPFで サーバーレス実行基盤を二層防御する
keitah
1
600
AIエージェント時代のPlatform as a Product —— テックリードがPdMとして回す発見・導入・計測 / Platform as a Product in the AI Agent Era
toshi0607
1
340
音声コミュニティを守るAI監視基盤_ 90%以上の入力削減を支えたServerless設計と運用判断
shuheioka123
0
110
なぜ「決定性」が 決定的に重要なのか? Durable Execution 基盤の数理的理解 #serverlessjp / ServerlessDays Tokyo 2026
ytaka23
4
1.3k
Featured
See All Featured
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.8k
Design of three-dimensional binary manipulators for pick-and-place task avoiding obstacles (IECON2024)
konakalab
0
600
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Raft: Consensus for Rubyists
vanstee
142
7.7k
エンジニアに許された特別な時間の終わり
watany
109
250k
Building the Perfect Custom Keyboard
takai
2
890
Are puppies a ranking factor?
jonoalderson
2
3.9k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
440
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
830
End of SEO as We Know It (SMX Advanced Version)
ipullrank
3
4.4k
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
420
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.4k
Transcript
PAGE DAY 2019/02/14 # MOONGIFT / 50 Webアプリを高速化する WebAssembly 1
PAGE # MOONGIFT / 50 DAY 2019/02/14 自己紹介 2 @goofmint
fb.me/goofmint 中津川 篤司 株式会社MOONGIFT代表取締役 エバンジェリスト コミュニティ 主催 https://www.moongift.jp
PAGE # MOONGIFT / 50 DAY 2019/02/14 今日話すこと •WebAssemblyとは何か? •WebAssemblyで何ができるのか、何ができないのか
•WebAssemblyの使いどころ 3
PAGE # MOONGIFT / 50 DAY 2019/02/14 今日話さないこと •WebAssemblyの開発方法 4
PAGE # MOONGIFT / 50 DAY 2019/02/14 WebAssemblyとは? 5
PAGE # MOONGIFT / 50 DAY 2019/02/14 Webブラウザで動作する高速バイナリ •プログラミング言語ではありません •バイナリとテキスト型があります
6
PAGE # MOONGIFT / 50 DAY 2019/02/14 WebAssemblyの歴史 7
PAGE # MOONGIFT / 50 DAY 2019/02/14 Ajax登場!(2004年くらい) 8
____ /⌒ ⌒\ /( •) (•)\ /::::::⌒(__人__)⌒:::::\ これからはJavaScriptだお! | |r┬-| | \ `ー'´ /
PAGE # MOONGIFT / 50 DAY 2019/02/14 JavaScriptの苦しみ…(2005年くらい) 9
____ / \ / _ノ ヽ、_ \ / o゚((•)) ((•))゚o \ ほんとはJavaScriptやりたくないんだお… | (__人__) | \ ` ⌒´ / 型がない APIが圧倒的に不足 HTMLの表現力が貧弱
PAGE # MOONGIFT / 50 DAY 2019/02/14 ____
/⌒ ⌒\ /( •) (•)\ /::::::⌒(__人__)⌒:::::\ これからは だお! | |r┬-| | \ `ー'´ / 別な言語の採用 10
PAGE # MOONGIFT / 50 DAY 2019/02/14 HTML5の誕生(2008年くらい) 11
,.x ≦三三≧ x、 ∠彡''"´^~^゙`ヾミミへ /シノ´ .:..:.ヾjミヘ ハⅣ . .:.V小. {川l! . .: .:.:Vノハ {{川 . .: .:.VノA 「:.:V ==ミx. ,x=≦.:.:V:::::} . !::〈\_rf込;ハ __,rf込;ハ_/ミ.:::{ {彡' 乂_ノ´⌒'乂_ノ.:.ミ.::リ Xィィx ,' :..〉 ,,;ミド’ . Ⅵ彡 ;xハーXメミ、 ミミYリ V彡彡'‐- - -‐'ミミハⅣ ヾ彡ィxィ小ハV彡ハjVヽ. トミ彡イ川从{ミjシ:::::::::`ー- .._ . /\`'" {^\T":::::::::::::::::::::::::::::`ヽ、 _..-''":::::::::::::::「`\ \:::::::::::::::::::::::::::::::::::: _..-'"::::::::::::::::::::::::r ヽ. ` ヽ::::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::∧ ` ',:::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::{ i::::::::::::::::::::::::::::: ::::::::::::::::::::::::::::::::ヽ. |::::::::::::::::::::::::::::: Flash?サポートしないよ
PAGE # MOONGIFT / 50 DAY 2019/02/14 asm.jsの誕生(2013年くらい) •JavaScriptのサブセット言語 •JavaScriptに制約を加えてコンパイル&キャッシュ
•EmscriptenでC/C++からasm.jsに変換 12
PAGE # MOONGIFT / 50 DAY 2019/02/14 WebAssemblyの誕生(現在) 13
____ /⌒ ⌒\ /( •) (•)\ /::::::⌒(__人__)⌒:::::\ Emscriptenがサポートしたお! | |r┬-| | \ `ー'´ /
PAGE # MOONGIFT / 50 DAY 2019/02/14 WebAssemblyの特徴 14
PAGE # MOONGIFT / 50 DAY 2019/02/14 ポジティブな特徴 •高速(数値計算ならJavaScriptの数十倍) •高い難読性
•多彩な言語から作成可能 15
PAGE # MOONGIFT / 50 DAY 2019/02/14 テキストとバイナリ 16 (module
(func $getAnswer (result i32) i32.const 42) (func (export "getAnswerPlus1") (result i32) call $getAnswer i32.const 1 i32.add))
PAGE # MOONGIFT / 50 DAY 2019/02/14 inline-wast 17 const
{wastInstructions} = require('inline-wast/lib/interpreter'); function add(a, b) { const fn = wastInstructions` (i32.const ${a}) (i32.const ${b}) (i32.add) `; return fn(); } console.log(add(3, 1)); // 4 https://github.com/xtuc/inline-wast
PAGE # MOONGIFT / 50 DAY 2019/02/14 対応ブラウザ 18
PAGE # MOONGIFT / 50 DAY 2019/02/14 対応言語 •C /
C++ •Rust •C# •Java(TeaVM) 19 •Go •AssemblyScript •Kotlin/Native •walt
PAGE # MOONGIFT / 50 DAY 2019/02/14 AssemblyScript •JavaScriptのSuper setであるTypeScript
のSub set •JavaScriptライクな記法でWebAssemblyが 書ける 20
PAGE # MOONGIFT / 50 DAY 2019/02/14 AssemblyScript 21 declare
function sayHello(): void; sayHello(); export function add(x: i32, y: i32): i32 { return x + y; } WebAssembly.instantiateStreaming( fetch("../out/main.wasm"), { main: { sayHello() { console.log("Hello from WebAssembly!"); } }, env: { abort(_msg, _file, line, column) { console.error("abort at main.ts:" + line + ":" + column); } }, }).then(result => { const exports = result.instance.exports; document.getElementById("container").textContent = "Result: " + exports.add(19, 23); }).catch(console.error);
PAGE # MOONGIFT / 50 DAY 2019/02/14 ネガティブな特徴 •DOM、ネットワークが使えない •要コンパイル
22
PAGE # MOONGIFT / 50 DAY 2019/02/14 弱点の克服法 •Canvasのポインターを渡す •Webブラウザ(メインスレッド)と通信する
23
PAGE # MOONGIFT / 50 DAY 2019/02/14 WebAssemblyの使いどころ 24
PAGE # MOONGIFT / 50 DAY 2019/02/14 ゲーム 25 https://beta.unity3d.com/jonas/AngryBots/
PAGE # MOONGIFT / 50 DAY 2019/02/14 Webアプリケーション •vim.wasm •Squoosh
26 https://rhysd.github.io/vim.wasm/ https://squoosh.app/
PAGE # MOONGIFT / 50 DAY 2019/02/14 チャート 27 Perspective
PAGE # MOONGIFT / 50 DAY 2019/02/14 他言語実行環境 •Ruby ->
https://runrb.io/ •Python -> https://alpha.iodide.io/notebooks/300/ •Swift -> https://swiftwasm.org/ •Perl -> https://webperl.zero-g.net/ •Lua -> https://cdn.rawgit.com/vvanders/wasm_lua/ d68f46a8/main.html 28
PAGE # MOONGIFT / 50 DAY 2019/02/14 最近のWebAssembly 29
PAGE # MOONGIFT / 50 DAY 2019/02/14 DOM/ネットワークの利用 •Rust +
wasm-bindgen •Go + syscall/js 30
PAGE # MOONGIFT / 50 DAY 2019/02/14 Rust + wasm-bindgen
31 use wasm_bindgen::prelude::*; #[wasm_bindgen] extern "C" { fn alert(s: &str); } #[wasm_bindgen] pub fn greet(name: &str) { alert(&format!("Hello, {}!", name)); } import { greet } from "./hello_world"; greet("World!");
PAGE # MOONGIFT / 50 DAY 2019/02/14 Go + syscall/js
32 package main import "syscall/js" func main() { document := js.Global().Get("document") button := document.Call("getElementById", "btn") cb1 := js.NewCallback(func(args []js.Value) { println("Clicked"); }) button.Call("addEventListener", "click", cb1) <-make(chan struct{}, 0) } <script src="wasm_exec.js"></script> <script> const go = new Go(); WebAssembly.instantiateStreaming( fetch(“main.wasm"), go.importObject ) .then((result) => { go.run(result.instance); }); </script>
PAGE # MOONGIFT / 50 DAY 2019/02/14 WASM = ユニバーサルバイナリ
•どんな言語であってもWASMに変換すれ ば、別な環境で実行できる 33 }
PAGE # MOONGIFT / 50 DAY 2019/02/14 WASM = ユニバーサルバイナリ
•どんな言語であってもWASMに変換すれ ば、別な環境で実行できる 34 {
PAGE # MOONGIFT / 50 DAY 2019/02/14 https://wasmer.io/ $ curl
https://get.wasmer.io -sSfL | sh $ wasmer run nginx.wasm Running Nginx on localhost:8080 Press Ctrl-C to stop...
PAGE # MOONGIFT / 50 DAY 2019/02/14 CDNのエッジでWASMを実行 •Cloudflare Workers
•Lucet 36
PAGE # MOONGIFT / 50 DAY 2019/02/14 WASI •WASMはコンパイル時にターゲットOSが決まらない弱点 •単一バイナリですべての環境で動作するようAPIを策定
37
PAGE # MOONGIFT / 50 DAY 2019/02/14 まとめ 38
PAGE # MOONGIFT / 50 DAY 2019/02/14 WebAssemblyをマスターしよう •多彩な言語から変換可能! •GoやRustならJavaScriptに触れなくても良い!
•より高機能化するWebアプリケーションにぜひ! 39
PAGE # MOONGIFT / 50 DAY 2019/02/14 ! Thanks! @goofmint
fb.me/goofmint ご感想お待ちします!