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
C#コードの結合を可視化する Roslyn解析による設計改善と リファクタリング判断
dora56
0
830
メルカリにおけるAI時代の高速プロトタイピング基盤「Arca」
ryotarai
15
12k
SREへの勘違いに気づいた後の話
tomodakengo
0
170
いちAWSエンジニアのAI活用を振り返る #devio2026 / devio osaka 2026 kawahara
masahirokawahara
1
110
AIエージェントを安全で速い現場監督にする:Jev・Obsidian・メタハーネス
x5gtrn
PRO
0
130
Snowflake Horizon Catalog と Apache Iceberg で作る オープンなデータ基盤
kitagawaz
0
180
Claude Codeを「使うほど育つ」AI秘書にするノウハウ
minorun365
PRO
32
33k
HacobuにおけるFDEとは/登壇資料(戸井田 裕貴)
hacobu
PRO
1
120
特殊変数大全
dak2
0
150
音声コミュニティを守るAI監視基盤_ 90%以上の入力削減を支えたServerless設計と運用判断
shuheioka123
0
110
セルフサービスのオブザーバビリティ基盤をOpenTelemetryで作る / Building a Self-Service Observability Platform with OpenTelemetry
ymotongpoo
3
390
AIは推し活である。
kurazuuuuuu
2
990
Featured
See All Featured
Leadership Guide Workshop - DevTernity 2021
reverentgeek
1
370
Deep Space Network (abreviated)
tonyrice
0
320
Breaking role norms: Why Content Design is so much more than writing copy - Taylor Woolridge
uxyall
1
420
SERP Conf. Vienna - Web Accessibility: Optimizing for Inclusivity and SEO
sarafernandez
2
1.6k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
エンジニアに許された特別な時間の終わり
watany
109
250k
Beyond borders and beyond the search box: How to win the global "messy middle" with AI-driven SEO
davidcarrasco
3
270
Bash Introduction
62gerente
615
220k
Un-Boring Meetings
codingconduct
0
430
Distributed Sagas: A Protocol for Coordinating Microservices
caitiem20
333
23k
The Spectacular Lies of Maps
axbom
PRO
1
1k
Chasing Engaging Ingredients in Design
codingconduct
0
340
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 ご感想お待ちします!