SlideShare une entreprise Scribd logo
1  sur  18
Télécharger pour lire hors ligne
Rust My Node
Ou pourquoi tout développeur Node.js devrait apprendre Rust
What I do
Thomas Haessle
@Oteku

https://oteku.github.io/
cutii.io
Cutii au coeur
de la ville
Création
d’un réseau
d’animateurs
locaux
Implication
des agents
publics
Villes
numériques
Valoriser le
patrimoine
MUSEUM
www.cutii.io
Cutii est une plateforme de mise en relation à distance pour les
personnes isolées ou dépendantes avec leur famille et une communauté
regroupant particuliers, aidants, associations et médecins.
Communauté solidaire
CUTII RÉSEAU
Activités premium Recréer du lien social Rencontres citoyennes
Le meilleur runtime web
Javascript application Javascript modules
Node.js Standard library
Node.js bindings
Javascript VM Event loop, Async I/O, Thread pooling
Http parser
OpenSSL
zlib

DNS
OS Non blocking I/O call
epollIOCP kqueue
Node addons
Node
• Node est monothreadé pour VOTRE code JS ”(ᴗ_ ᴗ。)
• Il y a un thread pour libuv, qui gère lui même un poll de thread pour
les I/O asynchrone (4 par défaut, jusque 128) (∩`-´)⊃━☆゚.*・。゚ et
communique avec node grace à des event emitter et des callbacks
• Chaque version de node est liée à une version du moteur v8 

( ̄^ ̄)ゞ

Addons
• Des « dynamically-linked shared objects », écrits en C++, en
utilisant l’api V8 api, qui peuvent être importé par la
fonction require()  (๑>ᴗ<๑)
• Des modules compilés dépendant de V8

=> le build dépend de la version de node et de l’OS (╬ Ò ‸ Ó)
• Depuis Node 8, il existe n-api, une abstraction indépendante
de la version de V8 ᕦ(ò_óˇ)ᕤ 

… mais ce n’est toujours pas la norme (╥_╥)
Quand & Pourquoi
• Réutiliser du code C ou C++ existant
• Utiliser des librairies binaires : statiques (.a) ou dynamiques
(.so / .dylib / .dll)
• Viser des performances natives
• Avoir accès aux ressources systèmes (I/O, ports séries, GPU, …)
• Utiliser des worker threads pour des algo plus intéressant en
multithreading
• Typer statiquement une librairie
Anti patterns
• Ré-écrire l’event loop
• Faire des I/O intensif : libuv sera meilleur
• Seulement typer un programme : 

- les approches « js as a bytecode » seront meilleures
(js_of_ocaml, Kotlinjs, Typescript, Purescript,…)

- Ou même WASM (Rust wasm-pack)
Donc je peux utiliser Javascript et C++
Mon réflexe fasse au CPP ?

Rust : sauve moi !
Rust features in "short" :
• Memory Safe
• Compiler that block lot of runtime errors
• Interface with C/C++
• Generic
• Polymorphism
• No garabage collector
• No manual memory allocation / desallocation
• No segmentation fault
• No data race
• Amazing toolchain
• Compile to native apps, libs, webassembly or even node native addons.
Immutablité et ADT
type coord3d = (i32, i32, i32);
let warehouseCoord: coord3d = (1, 4, 18);
let mut warehouse2Coord: coord3d = (1, 4, 18);
warehouse2Coord = (2, 7, 18);
struct Hero {
age: u8,
name: String,
}
let name = String::from("Jaime Lanister");
let jaime = Hero {
name, // punning
age: 32,
};
enum LifeVariant {
Alive(Hero),
Dead,
WhiteWalker
}
Pattern Matching
let how_is_jaime = LifeVariant::Alive(jaime);
fn get_message(how_are_you: LifeVariant) -> String{
match how_are_you {
LifeVariant::WhiteWalker => String::from("Aaaaaarg !"),
LifeVariant::Dead => String::from("!!!"),
LifeVariant::Alive(h) => String::from("Great! ") + &h.name + " is alive",
}
};
assert_eq!(get_message(how_is_jaime), String::from("Great! Jaime Lannister is alive"));
No Null - Option & Result
type Weapon = Option<String>;
type MyError = &'static str;
fn strike(who : Hero, with: Weapon) -> Result<LifeVariant, MyError> {
if who.name.is_empty() {
Err("No One can't be killed")
}else{
if let None = with {
Ok(LifeVariant::Alive(who))
}else{
Ok(LifeVariant::Dead )
}
}
}
Génériques et macros
fn compose_two<A, B, C, G, F>(f: F, g: G) -> impl FnOnce(A) -> C
where
F: FnOnce(A) -> B,
G: FnOnce(B) -> C,
{
move |x| g(f(x))
}
macro_rules! compose {
( $last:expr ) => { $last };
( $head:expr, $($tail:expr), +) => {
compose_two($head, compose!($($tail),+))
};
}
fn main() {
let double = |x| x * 2;
let add2 = |x| x + 2;
let double_then_add2 = compose!(double, add2);
println!("Result is {}", double_then_add2(10));
}
Traits (« Type classes »)
struct Scalar<T>(T);
use std::ops::BitOr;
impl<A, B, F> BitOr<F> for Scalar<A>
where F: FnOnce(A) -> B
{
type Output = Scalar<B>;
fn bitor(self, f: F) -> Scalar<B> {
Scalar(f(self.0))
}
}
impl<T> Scalar<T> {
fn unwrap(self) -> T{
self.0
}
}
Thread safe, Memory safe & Fast
Vous ne connaissez pas Rust
• LilleFP Talk : https://youtu.be/4zVC2goUcaY
• Lisez la doc : https://doc.rust-lang.org/stable/book/
• Lisez ce livre
Demo time
https://github.com/oteku/rust-my-node
Addons ou Wasm ?

Contenu connexe

Similaire à Rust my node

Rust sans (trop) roter du sang — Touraine Tech 2023 — par Édouard Siha & Ale...
Rust sans (trop) roter du sang — Touraine Tech 2023 —  par Édouard Siha & Ale...Rust sans (trop) roter du sang — Touraine Tech 2023 —  par Édouard Siha & Ale...
Rust sans (trop) roter du sang — Touraine Tech 2023 — par Édouard Siha & Ale...Horgix
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejsnaholyr
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovyguest6e3bed
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation GroovyJS Bournival
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab ElasticsearchDavid Pilato
 
Kevin Avignon: Roslyn - La plateforme de compilation .NET
Kevin Avignon: Roslyn - La plateforme de compilation .NETKevin Avignon: Roslyn - La plateforme de compilation .NET
Kevin Avignon: Roslyn - La plateforme de compilation .NETMSDEVMTL
 
Présentation LMAX / Disruptor
Présentation LMAX / DisruptorPrésentation LMAX / Disruptor
Présentation LMAX / DisruptorSOAT
 
Une introduction à Javascript et ECMAScript 6
Une introduction à Javascript et ECMAScript 6Une introduction à Javascript et ECMAScript 6
Une introduction à Javascript et ECMAScript 6Jean-Baptiste Vigneron
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Guillaume Laforge
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoftdavrous
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage GoSylvain Wallez
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015Stéphane Legrand
 
Hacking your home
Hacking your homeHacking your home
Hacking your homelaurenthuet
 

Similaire à Rust my node (20)

Rust sans (trop) roter du sang — Touraine Tech 2023 — par Édouard Siha & Ale...
Rust sans (trop) roter du sang — Touraine Tech 2023 —  par Édouard Siha & Ale...Rust sans (trop) roter du sang — Touraine Tech 2023 —  par Édouard Siha & Ale...
Rust sans (trop) roter du sang — Touraine Tech 2023 — par Édouard Siha & Ale...
 
Cours Ynov JS B1_1
Cours Ynov JS B1_1Cours Ynov JS B1_1
Cours Ynov JS B1_1
 
Réu technodejs
Réu technodejsRéu technodejs
Réu technodejs
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Présentation Groovy
Présentation GroovyPrésentation Groovy
Présentation Groovy
 
Vert.x 3
Vert.x 3Vert.x 3
Vert.x 3
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
Kevin Avignon: Roslyn - La plateforme de compilation .NET
Kevin Avignon: Roslyn - La plateforme de compilation .NETKevin Avignon: Roslyn - La plateforme de compilation .NET
Kevin Avignon: Roslyn - La plateforme de compilation .NET
 
Hackerspace jan-2013
Hackerspace jan-2013Hackerspace jan-2013
Hackerspace jan-2013
 
Cours php
Cours phpCours php
Cours php
 
Présentation LMAX / Disruptor
Présentation LMAX / DisruptorPrésentation LMAX / Disruptor
Présentation LMAX / Disruptor
 
Une introduction à Javascript et ECMAScript 6
Une introduction à Javascript et ECMAScript 6Une introduction à Javascript et ECMAScript 6
Une introduction à Javascript et ECMAScript 6
 
Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013Les nouveautés de Groovy 2 -- Mix-IT 2013
Les nouveautés de Groovy 2 -- Mix-IT 2013
 
Nouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde MicrosoftNouveautés JavaScript dans le monde Microsoft
Nouveautés JavaScript dans le monde Microsoft
 
Formation python
Formation pythonFormation python
Formation python
 
Introduction au langage Go
Introduction au langage GoIntroduction au langage Go
Introduction au langage Go
 
Vert.x
Vert.xVert.x
Vert.x
 
Tour Horizont.Net
Tour Horizont.NetTour Horizont.Net
Tour Horizont.Net
 
Presentation langage go_19022015
Presentation langage go_19022015Presentation langage go_19022015
Presentation langage go_19022015
 
Hacking your home
Hacking your homeHacking your home
Hacking your home
 

Rust my node

  • 1. Rust My Node Ou pourquoi tout développeur Node.js devrait apprendre Rust
  • 2. What I do Thomas Haessle @Oteku
 https://oteku.github.io/ cutii.io Cutii au coeur de la ville Création d’un réseau d’animateurs locaux Implication des agents publics Villes numériques Valoriser le patrimoine MUSEUM www.cutii.io Cutii est une plateforme de mise en relation à distance pour les personnes isolées ou dépendantes avec leur famille et une communauté regroupant particuliers, aidants, associations et médecins. Communauté solidaire CUTII RÉSEAU Activités premium Recréer du lien social Rencontres citoyennes
  • 3. Le meilleur runtime web Javascript application Javascript modules Node.js Standard library Node.js bindings Javascript VM Event loop, Async I/O, Thread pooling Http parser OpenSSL zlib
 DNS OS Non blocking I/O call epollIOCP kqueue Node addons
  • 4. Node • Node est monothreadé pour VOTRE code JS ”(ᴗ_ ᴗ。) • Il y a un thread pour libuv, qui gère lui même un poll de thread pour les I/O asynchrone (4 par défaut, jusque 128) (∩`-´)⊃━☆゚.*・。゚ et communique avec node grace à des event emitter et des callbacks • Chaque version de node est liée à une version du moteur v8 
 ( ̄^ ̄)ゞ

  • 5. Addons • Des « dynamically-linked shared objects », écrits en C++, en utilisant l’api V8 api, qui peuvent être importé par la fonction require()  (๑>ᴗ<๑) • Des modules compilés dépendant de V8
 => le build dépend de la version de node et de l’OS (╬ Ò ‸ Ó) • Depuis Node 8, il existe n-api, une abstraction indépendante de la version de V8 ᕦ(ò_óˇ)ᕤ 
 … mais ce n’est toujours pas la norme (╥_╥)
  • 6. Quand & Pourquoi • Réutiliser du code C ou C++ existant • Utiliser des librairies binaires : statiques (.a) ou dynamiques (.so / .dylib / .dll) • Viser des performances natives • Avoir accès aux ressources systèmes (I/O, ports séries, GPU, …) • Utiliser des worker threads pour des algo plus intéressant en multithreading • Typer statiquement une librairie
  • 7. Anti patterns • Ré-écrire l’event loop • Faire des I/O intensif : libuv sera meilleur • Seulement typer un programme : 
 - les approches « js as a bytecode » seront meilleures (js_of_ocaml, Kotlinjs, Typescript, Purescript,…)
 - Ou même WASM (Rust wasm-pack)
  • 8. Donc je peux utiliser Javascript et C++
  • 9. Mon réflexe fasse au CPP ?
 Rust : sauve moi ! Rust features in "short" : • Memory Safe • Compiler that block lot of runtime errors • Interface with C/C++ • Generic • Polymorphism • No garabage collector • No manual memory allocation / desallocation • No segmentation fault • No data race • Amazing toolchain • Compile to native apps, libs, webassembly or even node native addons.
  • 10. Immutablité et ADT type coord3d = (i32, i32, i32); let warehouseCoord: coord3d = (1, 4, 18); let mut warehouse2Coord: coord3d = (1, 4, 18); warehouse2Coord = (2, 7, 18); struct Hero { age: u8, name: String, } let name = String::from("Jaime Lanister"); let jaime = Hero { name, // punning age: 32, }; enum LifeVariant { Alive(Hero), Dead, WhiteWalker }
  • 11. Pattern Matching let how_is_jaime = LifeVariant::Alive(jaime); fn get_message(how_are_you: LifeVariant) -> String{ match how_are_you { LifeVariant::WhiteWalker => String::from("Aaaaaarg !"), LifeVariant::Dead => String::from("!!!"), LifeVariant::Alive(h) => String::from("Great! ") + &h.name + " is alive", } }; assert_eq!(get_message(how_is_jaime), String::from("Great! Jaime Lannister is alive"));
  • 12. No Null - Option & Result type Weapon = Option<String>; type MyError = &'static str; fn strike(who : Hero, with: Weapon) -> Result<LifeVariant, MyError> { if who.name.is_empty() { Err("No One can't be killed") }else{ if let None = with { Ok(LifeVariant::Alive(who)) }else{ Ok(LifeVariant::Dead ) } } }
  • 13. Génériques et macros fn compose_two<A, B, C, G, F>(f: F, g: G) -> impl FnOnce(A) -> C where F: FnOnce(A) -> B, G: FnOnce(B) -> C, { move |x| g(f(x)) } macro_rules! compose { ( $last:expr ) => { $last }; ( $head:expr, $($tail:expr), +) => { compose_two($head, compose!($($tail),+)) }; } fn main() { let double = |x| x * 2; let add2 = |x| x + 2; let double_then_add2 = compose!(double, add2); println!("Result is {}", double_then_add2(10)); }
  • 14. Traits (« Type classes ») struct Scalar<T>(T); use std::ops::BitOr; impl<A, B, F> BitOr<F> for Scalar<A> where F: FnOnce(A) -> B { type Output = Scalar<B>; fn bitor(self, f: F) -> Scalar<B> { Scalar(f(self.0)) } } impl<T> Scalar<T> { fn unwrap(self) -> T{ self.0 } }
  • 15. Thread safe, Memory safe & Fast
  • 16. Vous ne connaissez pas Rust • LilleFP Talk : https://youtu.be/4zVC2goUcaY • Lisez la doc : https://doc.rust-lang.org/stable/book/ • Lisez ce livre