Slide 1

Slide 1 text

͓ͷ͏͑ 3VTU8FC"TTFNCMZͰ޿͕Δ 8FCͷະདྷ '30/5&/%$0/'&3&/$& ೥݄೔

Slide 2

Slide 2 text

ࣗݾ঺հ w ඌ্༸հ :PTVLF0OPVF w ೔ຊେֶจཧֶ෦৘ใՊֶՊॿڭ w OHLZPUPΦʔΨφΠβʔ w ৘ใՄࢹԽɺ਺ཧ࠷దԽɺҙࢥܾఆࢧԉͷݚڀ w ՄࢹԽγεςϜͷ։ൃʹ8FCϑϩϯτΤϯυٕज़Λ࢖༻

Slide 3

Slide 3 text

લճ·Ͱͷ͋Β͢͡

Slide 4

Slide 4 text

2015/08/22 グランフロントエンド asm.jsとWebAssemblyって実際なんなの? おのうえ (@_likr) !4

Slide 5

Slide 5 text

フリーランチの終焉 ✤ フロントエンド開発への要求は⾼まる ✤ ハードウェア、JSエンジンの性能向上の恩恵を知らな いうちに受けていた時代は終わるかもしれない? ✤ フロントエンドエンジニア(JSプログラマ)が
 JavaScriptプログラムの速度に負う責任が増す !5

Slide 6

Slide 6 text

まとめ ✤ asm.jsを効果的に使えば、これまでWebでできなかっ た種類のアプリケーションが実現できる ✤ WebAssemblyによる順当な進化に期待 ✤ なんでも速くなる魔法ではないので、
 ⽤法⽤量を守って正しくお使いください !6

Slide 7

Slide 7 text

プログラミング⾔言語Rust おのうえ@_likr Grand Frontend Osaka 2016 2016年年8⽉月27⽇日

Slide 8

Slide 8 text

まとめ • Rustはいいぞ • WebAssemblyの実装は着実に進んでいる • RustでWebの部品を作れる未来はそう遠くない(かも • 未来に備えよう • たまにはWebの未来を考えてみるのはいかが?

Slide 9

Slide 9 text

ͦͯͦ͠ͷޙ

Slide 10

Slide 10 text

IUUQTXFCBTTFNCMZPSH

Slide 11

Slide 11 text

IUUQTXFCBTTFNCMZPSH 8FC"TTFNCMZIBTTIJQQFE JONBKPSCSPXTFSFOHJOFT ೥݄

Slide 12

Slide 12 text

8FC"TTFNCMZʢXBTNʣʁ w 8FCϒϥ΢β্Ͱಈ࡞͢ΔόΠφϦϑΥʔϚοτݴޠ w ଞݴޠ͔ΒίϯύΠϧͯ͠ੜ੒͢Δͷ͕Ұൠత w $$ɺ3VTUɺ(Pɺ"TTFNCMZ4DSJQUɺʜ
 IUUQTHJUIVCDPNBQQDZQIFSBXFTPNFXBTNMBOHT w ߴੑೳͰল༰ྔ w 4*.%ɺϚϧνεϨου wωΠςΟϒॲཧͱ8FCͷΪϟοϓΛຒΊΔ

Slide 13

Slide 13 text

&NTDSJQUFO w IUUQFNTDSJQUFOPSH w $$UPBTNKT8FC"TTFNCMZίϯύΠϥ w .P[JMMB͕த৺Ͱ։ൃ w --7.ϕʔε w MJCDɺMJCDʢЋʣͷޓ׵ϨΠϠʔ w ϑΝΠϧγεςϜɺ$(ɺήʔϜΤϯδϯɺFUD

Slide 14

Slide 14 text

(FUUJOH4UBSUFEXJUI&NTDSJQUFO $ emcc -s EXTRA_EXPORTED_RUNTIME_METHODS='["ccall", "cwrap"]' \
 -s EXPORTED_FUNCTIONS='["_twice"]' \ -s MODULARIZE=1 -s -o example.js example.c $ node main.js 4.4 1 double twice(double value) { 2 return value * 2; 3 } FYBNQMFD 1 const wasm = require('./example') 2 3 wasm().then((Module) => { 4 const twice = Module.cwrap('twice', 'number', ['number']) 5 console.log(twice(2.2)) 6 }) NBJOKT

Slide 15

Slide 15 text

$$ʁ w ϝϦοτ w ߴ଎ w ௿ϨΠϠʔͷૢ࡞ w աڈͷࢿ࢈ͷ׆༻ w σϝϦοτ w ҆શੑ w पลπʔϧͷෆࡏ #FUUFS$ͱͯ͠ͷ3VTU

Slide 16

Slide 16 text

3VTUʹΑΔ8FC"TTFNCMZͷग़ྗ w XBTNVOLOPXOFNTDSJQUFO w &NTDSJQUFOΛܦ༝ w &NTDSJQUFOͷϥϯλΠϜΛར༻Ͱ͖Δ w +BWB4DSJQU΍ϒϥ΢β"1*ͱͷ࿈ܞ wXBTNVOLOPXOVOLOPXO w ϥϯλΠϜͳ͠ʢܰྔ͕ͩ࠷খݶͷػೳ͚ͩʣ

Slide 17

Slide 17 text

4FUVQ $ curl https://sh.rustup.rs -sSf | sh $ source ~/.cargo/env $ rustup default nightly $ rustup target add wasm32-unknown-unknown

Slide 18

Slide 18 text

Ϗϧυ $ cargo new --lib example $ cd example $ cargo build --target wasm32-unknown-unknown 1 [package] 2 name = "example" 3 version = "0.1.0" 4 authors = ["Yosuke Onoue "] 5 6 [dependencies] 7 8 [lib] 9 crate-type = ["cdylib"] $BSHPUPNM 1 #[no_mangle] 2 pub fn twice(value: f64) -> f64 { 3 value * 2.0 4 } TSDMJCST

Slide 19

Slide 19 text

࣮ߦ 1 2 3 4 5 Rust + WebAssembly Example 6 7 8 9 fetch('./target/wasm32-unknown-unknown/debug/example.wasm') 10 .then((response) => response.arrayBuffer()) 11 .then((buffer) => WebAssembly.instantiate(buffer)) 12 .then(({ instance }) => { 13 const { twice } = instance.exports 14 console.log(twice(2.2)) 15 }) 16 17 18 JOEFYIUNM

Slide 20

Slide 20 text

8FC"TTFNCMZ+4"1* w XBTNϑΝΠϧΛಡΈࠐΜͰ8FC"TTFNCMZJOTUBOUJBUF ʹ౉͢ w "SSBZ#V⒎FSΛ௨ͨ͡௿ϨΠϠʔͳૢ࡞ w /VNCFSʢ਺஋ɺϙΠϯλʣɺ5ZQFE"SSBZΛ
 ѻ͏ؔ਺ͷݺͼग़͠ͷΈ 9 fetch('./target/wasm32-unknown-unknown/debug/example.wasm') 10 .then((response) => response.arrayBuffer()) 11 .then((buffer) => WebAssembly.instantiate(buffer)) 12 .then(({ instance }) => { 13 const { twice } = instance.exports 14 console.log(twice(2.2)) 15 })

Slide 21

Slide 21 text

XBTNCJOEHFO w IUUQTSVTUXBTNHJUIVCJPXBTNCJOEHFO w 3VTUΦϒδΣΫτͱ+BWB4DSJQUΦϒδΣΫτͷ
 ૬ޓม׵ϨΠϠʔΛఆٛͯࣗ͠ಈੜ੒ w KTTZTɺXFCTZTʹΑΔ+BWB4DSJQUɺϒϥ΢β"1*ͷૢ࡞ w &NTDSJQUFOෆཁ w XFCQBDLͰྑ͍ײ͡ʹಡΈࠐΈՄೳ DBSHPJOTUBMMXBTNCJOEHFODMJ

Slide 22

Slide 22 text

Ϗϧυ 1 extern crate wasm_bindgen; 2 3 use wasm_bindgen::prelude::*; 4 5 #[wasm_bindgen] 6 pub fn twice(value: f64) -> f64 { 7 value * 2.0 8 } TSDMJCST 1 [package] 2 name = "bindgen-example" 3 version = "0.1.0" 4 authors = ["Yosuke Onoue "] 5 edition = "2018" 6 7 [dependencies] 8 wasm-bindgen = "0.2" 9 10 [lib] 11 crate-type = ["cdylib"] $BSHPUPNM $ wasm-bindgen --out-dir . target/wasm32-unknown-unknown/debug/bindgen_example.wasm

Slide 23

Slide 23 text

࣮ߦ 1 import('./bindgen_example').then(({ twice }) => { 2 console.log(twice(2.2)) 3 }) JOEFYKT 1 const path = require('path') 2 3 module.exports = { 4 entry: './index.js', 5 output: { 6 path: path.resolve(__dirname), 7 filename: 'bundle.js' 8 } 9 } XFCQBDLDPOpHKT 1 2 3 4 5 wasm-bindgen Example 6 7 8 9 10 JOEFYIUNM

Slide 24

Slide 24 text

ଞʹͰ͖Δ͜ͱ 15 #[wasm_bindgen] 16 pub struct Screen { 17 bytes: Vec, 18 #[wasm_bindgen(readonly)] 19 pub width: usize, 20 #[wasm_bindgen(readonly)] 21 pub height: usize, 22 } 23 24 #[wasm_bindgen] 25 impl Screen { 26 #[wasm_bindgen(constructor)] 27 pub fn new(width: usize, height: usize) -> Screen { 28 Screen { 29 bytes: create_buffer(width, height), 30 width, 31 height, 32 } 33 } 34 42 43 pub fn resize(&mut self, width: usize, height: usize) { 44 self.bytes = create_buffer(width, height); 45 self.width = width; 46 self.height = height; 47 } 48 }

Slide 25

Slide 25 text

+BWB4DSJQUΫϥεͷੜ੒ w 3VTUͷߏ଄ମɺUSBJU͔Β+BWB4DSJQUΫϥεΛੜ੒ 1 const mod = import('mandelbrot') 2 const bg = import('mandelbrot/mandelbrot_bg') 3 Promise.all([mod, bg]).then(([{ mandelbrot, Screen }, { memory }]) => { 4 const canvas = this.display.nativeElement; 5 const screen = new Screen(canvas.width, canvas.height); 6 7 const bytes = new Uint8ClampedArray(memory.buffer, screen.pointer(), screen.size()); 8 const image = new ImageData(bytes, screen.width, screen.height); 9 mandelbrot(screen, -3, -2, 0.01, 100); 10 11 const ctx = canvas.getContext('2d'); 12 ctx.putImageData(image, 0, 0); 13 })

Slide 26

Slide 26 text

XBTNQBDL w IUUQTSVTUXBTNHJUIVCJPXBTNQBDL w DBSHP΁ͷUBSHFU௥ՃɺϏϧυͷ࣮ߦɺOQNύοέʔ δͷੜ੒ɺ഑෍·ͰΛࣗಈԽ DBSHPJOTUBMMXBTNQBDL XBTNQBDLCVJME XBTNQBDLQVCMJTI

Slide 27

Slide 27 text

࢖ͬͯΈͨ

Slide 28

Slide 28 text

ωοτϫʔΫՄࢹԽʹ͓͚Δར༻ w ωοτϫʔΫՄࢹԽʹ൐͏ܭࢉॲཧΛ8FC"TTFNCMZԽ
 ‎%KTͷ໿ഒͷੑೳΛୡ੒ w େن໛ͳωοτϫʔΫͷՄࢹԽ΋8FCͰ࣮ݱʂ IUUQTFHSBQIMJLSMBCDPNHSPVQJOBCPY

Slide 29

Slide 29 text

"OHVMBS*POJDͱ࢖͏

Slide 30

Slide 30 text

"OHVMBS*POJDͰͷϚϯσϧϒϩू߹ͷඳը IUUQTJPOJDXBTNNBOEFMCSPUMJLSMBCDPN

Slide 31

Slide 31 text

8FC"TTFNCMZͷࠓޙ

Slide 32

Slide 32 text

8FC"TTFNCMZͷࠓޙ w 1PTU.71'FBUVSFT w 5ISFBET w 4*.% w (BSCBHF$PMMFDUPS*OUFHSBUJPO w FUD w πʔϧαϙʔτͷॆ࣮ w TPVSDFNBQQJOH

Slide 33

Slide 33 text

8FCͷύϑΥʔϚϯεΛ௥ٻ͢Δҙຯ ཁٻύϑΥʔϚϯε ԸܙΛड͚ΔϢʔβʔͷ਺ ωΠςΟϒ
 σεΫτοϓΞϓϦ ͕Ͱ͖Δ͜ͱ ίϯϐϡʔλͷੑೳ޲্
 ˍཧ࿦ͷൃల 8FC͕Ͱ͖Δ͜ͱ -B[Z-PBEJOHɺ ΦϑεϨουॲཧ ".1ɺ18" 8FC"TTFNCMZɺ ฒྻॲཧ ύϑΥʔϚϯεͷ௥ٻ͕
 8FCͷՄೳੑΛ޿͛Δ

Slide 34

Slide 34 text

·ͱΊ w ීٴஈ֊ʹਐΉ8FC"TTFNCMZ w 3VTUͰ҆શ͔ͭߴ଎ͳ8FC։ൃΛ͢Δ࣌୅ͷ౸དྷ w ύϑΥʔϚϯε͕8FCͷՄೳੑΛ޿͛Δʂ w ศརͳपลπʔϧΛੋඇνΣοΫʂ w IUUQTSVTUXBTNHJUIVCJPXBTNCJOEHFO w IUUQTSVTUXBTNHJUIVCJPXBTNQBDL