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
Rust & Emscriptenの話
Search
Yosuke Onoue
November 21, 2015
Technology
250
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Rust & Emscriptenの話
Yosuke Onoue
November 21, 2015
More Decks by Yosuke Onoue
See All by Yosuke Onoue
ネットワーク可視化の世界
likr
8
7k
Think About Front-end Web Development with Rust
likr
2
590
Yewにおけるoff-the-main-thread
likr
1
850
行政事業レビューデータの可視化 / Visualization of Japan's National Budget with JUDGIT!
likr
1
270
モダンJavaScript再入門 / Re-introduction to Modern JavaScript
likr
24
12k
Web-based Data Visualization with Rust and WebAssembly
likr
4
6.2k
Introduction to Graph Drawing
likr
0
550
20190707Ionic_Meetup.pdf
likr
0
500
About the end of the web
likr
2
570
Other Decks in Technology
See All in Technology
はてなのサービス基盤を支える Kubernetes《足腰》
masayoshimaezawa
0
410
AIで政治は変わるのか? — 中高生と考えたAI時代の民主主義(東海高校サタデープログラム)
eitarosuda
0
350
AI・ロボティクスと自動化社会 / AI, Robotics, and the Automated Society
ks91
PRO
0
130
記録をかんたんに、提案をパーソナルに ── AIであすけんが目指すもの
oprstchn
0
100
From Prompt Engineering to Loop Engineering
shibuiwilliam
1
320
GitHub Copilot運用のリアル ~AI Credit時代にどう向き合うか~
takafumisu2uk1
0
600
「軸足」は 固定しなくていい - 熱量と強みで描く、しなやかなキャリアの形
kakehashi
PRO
1
320
AIペネトレーションテスト・ セキュリティ検証「AgenticSec」紹介資料
laysakura
2
7.9k
なぜ人は自分のプロジェクトを 「なんちゃってアジャイル」と 自嘲するのか
kozotaira
0
230
クラウドファンディング版StackChan 3体(4体)をインタラクティブな体験型作品にして展示もした話 / スタックチャンお誕生日会2026
you
PRO
0
270
AWS Summit の片隅で、体育座りしながらコミュニティがにぎわう理由を考えた
k_adachi_01
2
330
cccccc
moznion
0
770
Featured
See All Featured
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
750
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
First, design no harm
axbom
PRO
2
1.2k
Building an army of robots
kneath
306
46k
From Legacy to Launchpad: Building Startup-Ready Communities
dugsong
0
240
ラッコキーワード サービス紹介資料
rakko
1
3.8M
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Refactoring Trust on Your Teams (GOTO; Chicago 2020)
rmw
35
3.5k
The World Runs on Bad Software
bkeepers
PRO
72
12k
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
400
Are puppies a ranking factor?
jonoalderson
1
3.7k
GraphQLとの向き合い方2022年版
quramy
50
15k
Transcript
Rust & Emscriptenͷ ͓ͷ͏͑ (@_likr) 2015/11/21 2016ͷAltJSʹ͍ͭͯޠΔձ
ࣗݾհ • ͓ͷ͏͑ ( @_likr ) • ՄࢹԽͷݚڀͱ͔ͬͯΔ • ng-kyotoͱGDG
KobeͰελοϑͬͯΔ • D3.jsɺAngularJSɺReactͱ͔ͬͯΔ
ҙ • ωλൃදͰ͢ • ͙͢ʹࣄͰ͑Δٕज़Ͱ͋Γ·ͤΜ • AngularGoogleςΫϊϩδʔͷ͋Γ·ͤΜ • AltJSͷ͋·Γ͋Γ·ͤΜ
ΦϨͷߟ͑ͨ࠷ڧͷ ࣍ੈϑϩϯτΤϯυ։ൃ ͓ͷ͏͑ (@_likr) 2015/11/21 2016ͷAltJSʹ͍ͭͯޠΔձ
Γ͍ͨ͜ͱ • େنɾߴͳWebϑϩϯτΤϯυΞϓϦͷ։ൃ (ܭࢉɾΞϧΰϦζϜͳͲͷΣΠτେ͖͍)
JavaScriptͷਐา • ClassesɺArrow functionsɺModules • DecoratorsɺAsync/Await • Type Annotations •
…
JavaScriptɺWebϖʔδΛνΧνΧͤ͞ΔͨΊ ͚ͩͷػೳ͔Β͠ɺେن։ൃՄೳͳ ख़ͨ͠ϓϩάϥϛϯάݴޠʹͳΓͭͭ͋Δ
ͰɺJavaScript͕ͭΒ͍໘·ͩ͋ΔΑͶʁ
ྫ͑ɺredux JavaScriptͷΦϒδΣΫτΛpureʹอͭͨΊʹɺ • Array.fromɺObject.assignΛͬͨίϐʔ • immutable.jsͷར༻ JavaScriptͰimmutabilityͷอূ͍͠ state action reducer
next state ෭࡞༻ͷͳ͍ؔ →stateͷมߋېࢭʂ immutability: ΦϒδΣΫτ͕มߋ͞Εͳ͍͜ͱ
όάͷԹচ • มߋ͍͚ͯ͠ͳ͍ͷมߋ • มߋͯ͠ҙຯͳ͍ͷมߋ • ΞΫηε͍͚ͯ͠ͳ͍ͷΞΫηε • ্هΛอূ্ͨ͠Ͱͷtestability
ܧ͗͠ܧ͗͠ͷݴޠ༷Ͱɺ ৽͍͠ύϥμΠϜʹै͢Δͷݶքʁ
େنͰߴͳWebϑϩϯτΤϯυΞϓϦΛ ࣮͍͢͠ݴޠʁ
͍ΖΜͳݴޠ… • CɺC++ɺJavaɺScalaɺGoɺ HaskellɺOCamlɺCoffeeScriptɺ TypeScriptɺElmɺHaxeɺClosure Scriptɺ…ʁ
Rust
Rust • https://www.rust-lang.org/ • Mozilla͕։ൃͨ͠γεςϜϓϩάϥϛϯάݴޠ • 20155݄ʹόʔδϣϯ1.0ϦϦʔε • ݱࡏόʔδϣϯ1.4 •
࠾༻ࣄྫɿ Servo (https://github.com/servo/servo)
Rustͷಛ • ࣮ߦ • ߴͳநԽͱޮతͳ࣮ߦΛཱ྆ • ϝϞϦηʔϑ • ϝϞϦͷྖҬ֎ΞΫηεϝϞϦϦʔΫΛࢭ •
εϨουηʔϑ • ϚϧνεϨουϓϩάϥϛϯάͷϛεΛࢭ
ݸਓతͳϝϦοτ • Garbage Collection͕ͳ͍ • ThreadɺSIMDΛඪ४ϥΠϒϥϦͰαϙʔτ • Web AssemblyͷରԠ͕༗
ࠓɺRustͰWebϑϩϯτΤϯυ։ൃ͕Ͱ͖Δͷ͔ʁ
Emscripten
Emscripten • http://emscripten.org/ • LLVM to JavaScript Compiler • C/C++ϓϩάϥϜΛJavaScriptʹม
• ࠷దԽΛ༗ޮԽ͢Δͱasm.jsΛग़ྗ • কདྷతʹWebAssemblyʹରԠ
rust-webplatform • https://github.com/tcr/rust-webplatform • DOM APIͷബ͍ϥούʔ • ηοτΞοϓεΫϦϓτ͖ • cargo-build
(https://github.com/AerialX/cargo-build) • rust-rt-minimal (https://github.com/AerialX/rust)
Hello World 1 extern crate webplatform; 2 3 fn main()
{ 4 let document = webplatform::init(); 5 6 let p = document.element_create("p").unwrap(); 7 p.html_append("hello world"); 8 9 let body = document.element_query("body").unwrap(); 10 body.append(&p); 11 12 webplatform::spin(); 13 }
զʑ͕ཉ͔ͬͨ͠ͷ͜Εͳͷ͔ʁ
ޮྑ͍։ൃͷͨΊʹϑϨʔϜϫʔΫ͕ඞཁͩʂ
Virtual DOMͬΆ͍ͷΛ࣮ͯ͠ΈΔ
RustͰVirtual DOM • ComponentఆٛͱRendererΛ͢Δ • Pure RustͷComponentͱɺ ϒϥβͱΓͱΓ͢ΔRenderer • Mithril(https://lhorie.github.io/mithril/)Λਅࣅ͢Δ
• ܰྔɺγϯϓϧ
࡞ͬͨ 29 pub fn v(tag: &str, attributes: Vec<Attribute>, children: Vec<Node>)
-> Node { 30 Node::Element(Element { 31 tag: String::from_str(tag), 32 attributes: attributes, 33 children: children 34 }) 35 } ཁૉ໊ɺଐੑɺࢠComponentΛड͚औͬͯComponentΛੜ͢Δؔ ComponentΛड͚औͬͯHTMLͷॻ͖ग़͠Λߦ͏ؔ 9 pub fn mount<'a, T: 'a + Component>( 10 document: Rc<RefCell<Document<'a>>>, 11 root: Rc<RefCell<HtmlNode<'a>>>, 12 component: Rc<RefCell<T>>) { 13 let target = root.borrow(); 14 target.html_set(""); 15 let node = component.borrow().render(); 16 render(document, target.deref(), node, root.clone(), component); 17 }
࠶Hello World 8 struct Main; 9 10 impl Component for
Main { 11 fn render(&self) -> Node { 12 v("div", 13 vec![attribute("class", text_value("hoge"))], 14 vec![ 15 v("p", vec![], vec![ 16 text_node("hello"), 17 ]), 18 v("p", vec![], vec![ 19 text_node("world"), 20 ]) 21 ] 22 ) 23 } 24 } 25 26 fn main() { 27 let main_component = Rc::new(RefCell::new(Main)); 28 let document = Rc::new(RefCell::new(webplatform::init())); 29 let body = Rc::new(RefCell::new(document.borrow().element_query("body").unwrap())); 30 vdom::mount(document.clone(), body.clone(), main_component.clone()); 31 webplatform::spin(); 32 } <div class="hoge"> <p>hello</p> <p>world</p> </div>
Data Binding 10 struct Main { 11 state: Rc<RefCell<HashMap<String, String>>>
12 } 13 14 impl Component for Main { 15 fn render(&self) -> Node { 16 let key = String::from_str("message"); 17 let message = self.state.borrow().get(&key).unwrap().clone(); 18 v("div", 19 vec![attribute("class", text_value("hoge"))], 20 vec![ 21 v("p", vec![], vec![ 22 Node::Text(message.clone()), 23 ]), 24 v("input", vec![ 25 attribute("value", AttributeValue::Text(message.clone())), 26 attribute("change", AttributeValue::EventHandler(Box::new({ 27 let state = self.state.clone(); 28 move |e: &mut Event| { 29 let key = String::from_str("message"); 30 let mut st = state.borrow_mut(); 31 let node = e.target.as_mut().unwrap(); 32 st.insert(key, node.prop_get_str("value")); 33 } 34 }))), 35 ], vec![]) 36 ] 37 ) 38 } 39 } onchangeͷΠϕϯτϋϯυϥͰstateΛߋ৽ stateͷ༰Λදࣔ
• ྑ͔ͬͨ͜ͱɿܕ͕ݫ֨ • mutabilityɺownershipʹΑ͕ͬͯ Ͳ͜Ͱมߋ͞ΕΔͷ͔ϋϯυϦϯά͕༰қ • ѱ͔ͬͨ͜ͱɿܕ͕ݫ֨ • ΠϕϯτϋϯυϥΛॻ͘ͷʹҰۤ࿑
TODO • ࠩߋ৽ • σʔλϑϩʔ • RustϑϨϯυϦʔͳUtility • ੑೳଌఆ •
…
·ͱΊ • ͍Ζ͍Ζະ • Rustૉఢɺͯ҆͘શͳͣ • Virtual DOMΛ࣮͠Α͏ • ޙʹ͜ΜͳWebϑϩϯτΤϯυ։ൃ͕
ݱ࣮ͷͷʹͳ͍ͬͯΔ͔ʁ
ng-kyoto Angular Meetup #3