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
Webアプリを高速化する WebAssembly
Search
Atsushi Nakatsugawa
PRO
June 12, 2019
Technology
0
180
Webアプリを高速化する WebAssembly
Monaca UG TOKYO #9 〜先進的Web系技術を学ぶ〜
https://monacaug.connpass.com/event/131671/
の発表資料です。
Atsushi Nakatsugawa
PRO
June 12, 2019
Tweet
Share
More Decks by Atsushi Nakatsugawa
See All by Atsushi Nakatsugawa
DevRelに活かせるAIツールの紹介とレビュー
moongift
PRO
0
87
DevRelの基礎と戦略
moongift
PRO
0
47
DevRelの始め方
moongift
PRO
3
640
マンガで分かるDevRelオンライン
moongift
PRO
0
160
DevRel Online with Manga
moongift
PRO
0
90
DevRel 4コマ
moongift
PRO
0
150
DevRel 4 panel Manga
moongift
PRO
0
87
DevRelの基礎〜開発者マーケティング〜
moongift
PRO
0
42
DevRelの基礎〜DevX(開発者体験)〜
moongift
PRO
0
55
Other Decks in Technology
See All in Technology
ライフステージの変化を乗り越える 探索型のキャリア選択
tenshoku_draft
2
190
自分のやることに価値を見出だせるようになり、挑戦する勇気をもらったベイトソンの考え / Scrum Fest Fukuoka 2025
bonbon0605
0
130
Cracking the Coding Interview 6th Edition
gdplabs
14
28k
“常に進化する”開発現場へ! SHIFTが語るアジャイルQAの未来/20250306 Yuma Murase
shift_evolve
0
140
【Snowflake九州ユーザー会#2】BigQueryとSnowflakeを比較してそれぞれの良し悪しを掴む / BigQuery vs Snowflake: Pros & Cons
civitaspo
4
1.5k
Platform Engineeringで クラウドの「楽しくない」を解消しよう
jacopen
4
240
エンジニアのキャリアパスと、 その中で自分が大切にしていること
noteinc
3
1k
OPENLOGI Company Profile for engineer
hr01
1
20k
目標と時間軸 〜ベイビーステップでケイパビリティを高めよう〜
kakehashi
PRO
8
1.1k
EMConf JP 2025 懇親会LT / EMConf JP 2025 social gathering
sugamasao
2
210
Two Blades, One Journey: Engineering While Managing
ohbarye
4
2.8k
AWSではじめる Web APIテスト実践ガイド / A practical guide to testing Web APIs on AWS
yokawasa
8
800
Featured
See All Featured
Product Roadmaps are Hard
iamctodd
PRO
51
11k
The Power of CSS Pseudo Elements
geoffreycrofte
75
5.5k
Code Review Best Practice
trishagee
67
18k
KATA
mclloyd
29
14k
Making Projects Easy
brettharned
116
6k
A Modern Web Designer's Workflow
chriscoyier
693
190k
YesSQL, Process and Tooling at Scale
rocio
172
14k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
49
2.3k
XXLCSS - How to scale CSS and keep your sanity
sugarenia
248
1.3M
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
227
22k
Thoughts on Productivity
jonyablonski
69
4.5k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.2k
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 ご感想お待ちします!