Loading time is a major factor in page abandonment and loyalty; 53% of users
report that they abandon sites that take more than three seconds to
load (source: SOASTA Google study report).
Users visit more often, stay longer, search more, and buy more frequently on
sites that load quickly than on slower ones; one company found that a
conversion increase of 7% resulted from a speed improvement of as
little as .85 seconds (source: WPO Stats).
Slow loading is detrimental for search engine optimization
(SEO) because it can lower your site's ranking, resulting in fewer
visits, reads, and conversions; in 2018, Google will implement site speed as a
ranking signal in its mobile searches (source: Search Engine Land).
---
# Le langage imposé
---
# Optimisation des langages dynamiques
```js
function f(a) { return a + 42; }
```
--
```js
f(1); // integer
```
--
```js
f(13.37); // floating-point
```
--
```js
f("hi there"); // string
```
--
```js
f(false); // ???
f({ }); // ???
f({ toString() { return "hello, " + "world"; }}); // ???
f({ valueOf() { alert('lol'); return 1; }}); // ???
```
???
- langage dynamique => rend les optimisations plus difficiles
- inférence de types + hypothèses vérifiées dynamiquement
- décompilation, compilation, recompilation
- garbage collector -> pauses à l'exécution
---
class: center, middle
# Compiler vers le Web
### (semi) choix du langage
### code JS généré (supposé) efficace
???
D'où la compilation vers le web : prendre un langage de son choix, et le
compiler vers du JS à l'aide d'un outil qui fera toutes sortes d'optimisations
pour nous.
---
class: white-bg
background-image: url(./img/logo.png)
---
class: bigger
# WebAssembly ?
### Un **environnement d'exécution** stable, bien défini, sécurisé, rapide comme du natif.
???
- stable = par plateforme, architecture, etc.
- bien défini = le moins de comportements indéfinis possibles
--
### Un **standard** créé en coopération par Apple, Google, Microsoft et Mozilla.
???
Draft W3C depuis le 15 fevrier 2018
WG/CG (réunion tous les mois / deux semaines)
--
### Un format **binaire** compact, portable, rapide à charger et à *compiler*.
???
Bytecode.
--
### Le tout intégré dans la plateforme Web.
???
- plus de plugins (cause de crashes, pas besoin de les mettre à jour).
- possibilité d'interagir avec JS dans les deux sens (de JS vers wasm, ou wasm
vers JS).
---
class: middle, center, white-bg
# Support des navigateurs
--
![Dans tous les navigateurs](./img/browsers.png)
???
A l'heure de l'écriture, représente 75% des navigateurs selon CanIUse. (71% en
mai)
Existence d'un polyfill dans un sous ensemble de JS (asm.js) => amélioration
progressive.
---
# C'est efficace ?
--
## plus rapide à démarrer
## plus rapide à s'exécuter
## plus compact
???
Démarrage : fichier binaire, pas de parsing, pas d'exécution lazy, tiered
compilation, streaming compilation, mise en cache.
Exécution : langage statique typé, correspondance directe avec le CPU, pas
d'allocation mémoire (GC), précompilation par un gros compilateur. On est
seulement à un petit écart de 20% des performances natives, et ça n'arrête pas
d'évoluer !
Compact : binaire, moins à télécharger, moins de représentations internes en
mémoire, moins à stocker en mémoire, économie en bande-passante donc coûts
serveurs.
--
## debuggable
???
Debugable : format binaire, mais représentation textuelle pour pouvoir
inspecter le code source et le deboguer ! et source maps !
---
# Cas d'utilisation
## Porter des [programmes complets](https://www.youtube.com/watch?v=TwuIRcpeUWE)
???
Programmes complets : Unity / Unreal Engine.
--
## Porter des [libs](https://websightjs.com/index-video.html)
???
Porter des libs : OpenCV, NaCL (crypto), compression, codecs, etc.
--
## Utilisation dans des [libs](https://www.youtube.com/watch?v=qfnkDyHVJzs&feature=youtu.be&t=5880)
???
Utilisation dans des libs : React pour Fiber, Glimmer VM pour Ember, etc.
--
## Utilisation dans des [apps web](http://www.adultswim.com/etcetera/elastic-man/)
???
Faire une app web à partir de rien dans un autre langage que JS, ou porter des
parties critiques pour la performance.
---
# Pourquoi dans une app Web ?
--
### Résoudre une problématique spécifique de performances
???
Premature optimization root of all evil.
- Trouver les 20% de code qui prennent 80% du temps, avec un profiler.
- Optimiser ces 20%.
- S'il y a un autre problème de performance, reprendre un profiler.
--
### Profiter d'autres langages et de leurs environnements...
???
- plus simple que d'apprendre un nouveau langage, transfert de connaissances
- paradigmes différents de ceux dans JS
- possibilité de profiter du tooling (IDEs, etc.)
--
### ... tout en profitant de la plateforme Web
???
- facile à distribuer (on évite les app stores sur mobile ou desktop).
- facile à mettre à jour, à déployer comme on veut, de faire du A/B testing.
- la sécurité de la plateforme web (Content Security Policy, Subresource
Integrity, sandboxing...).
- intégration avec la plateforme Web
- source maps : montre le code source du langage utilisé directement dans le
debugger.
- profiler
---
class: bigger
# Ces langages qui compilent vers wasm
- C/C++ ([Emscripten](http://emscripten.org/), LLVM, CheerP)
- .NET ([Blazor](https://github.com/aspnet/blazor))
- Go
- Elixir
- Faust
- JVM
- Kotlin (native)
--
- [... et tous les autres](https://github.com/appcypher/awesome-wasm-langs)
--
- Rust !
---
class: middle, center
# Rust
![Rust loves JS](./img/rust_love_js.png)
(Copyright [Lin Clark](https://hacks.mozilla.org/2018/03/making-webassembly-better-for-rust-for-all-languages))
???
- Langage bas-niveau / "système"
- Mais avec une expressivité haut niveau
- Très rapide (langage compilé, typé statiquement)
- Vous empêche de faire des erreurs au moment de la compilation
- Multithreadé et safe: "fearless concurrency"
Initiative de Mozilla, mais utilisation dépasse Moz.
Dropbox, CoreOS, Coursera, OVH, npm inc, ... et GlimmerVM dans Ember !
Exemple de langage bien supporté pour être compilé vers du WebAssembly, les
mêmes concepts peuvent s'appliquer à tous les langages !
---
# C++ 👣 🔫
```c++
#include