Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Webアプリを高速化する WebAssembly

Webアプリを高速化する WebAssembly

Monaca UG TOKYO #9 〜先進的Web系技術を学ぶ〜
https://monacaug.connpass.com/event/131671/

の発表資料です。

Atsushi Nakatsugawa

June 12, 2019
Tweet

More Decks by Atsushi Nakatsugawa

Other Decks in Technology

Transcript

  1. PAGE # MOONGIFT / 50 DAY 2019/02/14 自己紹介 2 @goofmint

    fb.me/goofmint 中津川 篤司 株式会社MOONGIFT代表取締役 エバンジェリスト コミュニティ 主催 https://www.moongift.jp
  2. PAGE # MOONGIFT / 50 DAY 2019/02/14 Ajax登場!(2004年くらい) 8  

         ____      /⌒  ⌒\    /( •)  (•)\   /::::::⌒(__人__)⌒:::::\   これからはJavaScriptだお!   |     |r┬-|     |   \      `ー'´     /
  3. PAGE # MOONGIFT / 50 DAY 2019/02/14 JavaScriptの苦しみ…(2005年くらい) 9  

         ____      /      \    /  _ノ  ヽ、_  \   / o゚((•)) ((•))゚o \  ほんとはJavaScriptやりたくないんだお…   |     (__人__)    |   \     ` ⌒´     / 型がない APIが圧倒的に不足 HTMLの表現力が貧弱
  4. PAGE # MOONGIFT / 50 DAY 2019/02/14        ____

         /⌒  ⌒\    /( •)  (•)\   /::::::⌒(__人__)⌒:::::\   これからは           だお!   |     |r┬-|     |   \      `ー'´     / 別な言語の採用 10
  5. 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?サポートしないよ
  6. PAGE # MOONGIFT / 50 DAY 2019/02/14 WebAssemblyの誕生(現在) 13  

         ____      /⌒  ⌒\    /( •)  (•)\   /::::::⌒(__人__)⌒:::::\   Emscriptenがサポートしたお!   |     |r┬-|     |   \      `ー'´     /
  7. 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))
  8. 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
  9. PAGE # MOONGIFT / 50 DAY 2019/02/14 対応言語 •C /

    C++ •Rust •C# •Java(TeaVM) 19 •Go •AssemblyScript •Kotlin/Native •walt
  10. PAGE # MOONGIFT / 50 DAY 2019/02/14 AssemblyScript •JavaScriptのSuper setであるTypeScript

    のSub set •JavaScriptライクな記法でWebAssemblyが 書ける 20
  11. 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);
  12. PAGE # MOONGIFT / 50 DAY 2019/02/14 Webアプリケーション •vim.wasm •Squoosh

    26 https://rhysd.github.io/vim.wasm/ https://squoosh.app/
  13. 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
  14. 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!");
  15. 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>
  16. PAGE # MOONGIFT / 50 DAY 2019/02/14 WASM = ユニバーサルバイナリ

    •どんな言語であってもWASMに変換すれ ば、別な環境で実行できる 33 }
  17. PAGE # MOONGIFT / 50 DAY 2019/02/14 WASM = ユニバーサルバイナリ

    •どんな言語であってもWASMに変換すれ ば、別な環境で実行できる 34 {
  18. 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...
  19. PAGE # MOONGIFT / 50 DAY 2019/02/14 ! Thanks! @goofmint

    fb.me/goofmint ご感想お待ちします!