Asm.js
asm.js est un langage intermédiaire constituant un sous-ensemble du langage Javascript. Il permet une amélioration importante des performances pour les applications web écrites en langage à typage statique avec gestion manuelle de la mémoire (comme le C) puis converti en Javascript par un compilateur source à source. Asm.js ne vise pas à améliorer les performances de code Javascript écrit à la main et n'apporte rien d'autre qu'un gain de performance.
Il est destiné à obtenir des performances proches de celles obtenues par du code natif en limitant les fonctionnalités du langage à celles tirant parti de la compilation anticipée. En utilisant un sous-ensemble du langage Javascript, asm.js est déjà supporté par l'ensemble des navigateurs web[1] contrairement aux alternatives comme Google Native Client. Le navigateur Mozilla Firefox fût le premier navigateur à implémenter les optimisations spécifiques asm.js à partir de la version 22[2]. Les optimisations du moteur Javascript V8 présent dans Chrome 28 ont permis de doubler les performances obtenues sur le benchmark asm.js par rapport à la précédente version de Chrome[3].
Le projet Emscripten propose des outils permettant de compiler du code C, C++ (ou n'importe quel autre langage pouvant être converti en LLVM) en code asm.js[4].
Performances
Du fait qu'asm.js soit exécuté dans le navigateur, ses performances dépendent grandement du navigateur ainsi que du matériel sur lequel il s'exécute. Comme mentionné sur le site dédié au projet[réf. souhaitée], les essais préliminaires de programmes C compilés vers asm.js sont généralement plus lents d'un facteur 2 comparé à une compilation native avec Clang.
La majorité du gain de performance est obtenue par le typage de l'ensemble du code, résultant ainsi de l'absence de d'utilisation du ramasse miettes (la mémoire est gérée manuellement dans un tableau typé). Il en résulte un modèle plus simple, sans comportement dynamique, sans allocation ni désallocation dynamique de mémoire, utilisant uniquement des entiers et opérations à virgule flottante bien définies, permettant de bien meilleurs performances.
En décembre 2013, les mesures de Mozilla montraient des améliorations significatives[5]. Dans cet article, Mozilla précise que les performances d'un code natif compilé n'étaient pas issues d'une seule mesure mais plutôt d'un ensemble de tests opérés avec différents compilateurs.
Exemples
Par exemple, considérant le code C suivant :
int f(int i) {
return i + 1;
}
Emscripten devrait générer le code Javascript suivant :
function f(i) {
i = i|0;
return (i + 1)|0;
}
Ci-dessous un autre exemple pour calculer la longueur d'une chaine de caractère :
size_t strlen(char *ptr) {
char *curr = ptr;
while (*curr != 0) {
curr++;
}
return (curr - ptr);
}
Ce qui devrait donner le résultat suivant en code asm.js :
function strlen(ptr) {
ptr = ptr|0;
var curr = 0;
curr = ptr;
while (MEM8[curr]|0 != 0) {
curr = (curr + 1)|0;
}
return (curr - ptr)|0;
}
Dans le code généré, la variable MEM8 est en fait une vue « bit-à-bit » d'un tampon typé qui sert de tas au code asm.js.
Langages de programmation
- C/C++ – Clang et LLVM
- Lua VM – Lua machine virtuelle[6]
- Perl – portage de (micro)perl-5.16.3[7]
- Python – portage de CPython[8]
Framework applicatif
- Qt – portage de plusieurs démo Qt, plus des applications KDE, comme Kate[9]
Programmes et bibliothèques
Jeux et moteurs de jeu
- Unreal Engine 3 – version complète, portée en 4 jours seulement[12],[13]
- Le moteur de jeu Unity[14]
- Doom – L'adaptation Freedoom exécutée sur PrBoom, qui est basé sur le code open-source de Doom[15]
- SuperTux[16]
- ScummVM, qui supporte de nombreux jeux classiques d'aventure[17]
- Dune II via OpenDune[18]
- BananaBread[19]
- Tous les jeux présents dans le Humble Mozilla Bundle[20] (Super Hexagon, Aaaaa! for the awesome, Osmos, Zen Bound 2, Dustforce DX, Voxatron, FTL: Advanced Edition and Democracy 3)
Émulateurs
- JSMESS - Un portage de l’émulateur MESS pour plusieurs consoles de jeu et systèmes informatiques[21]
Mathématiques
- HTML5 Fractal Playground[22] – génération de motif fractal par fonctions itératives, tel que les fractales de Mandelbrot.
Voir aussi
- RPython
- CrossBridge
Références
- ↑ (en) « asm.js - Frequently Asked Questions »,
- ↑ (en) « Firefox 22.0 release notes », Mozilla (consulté le 4 juillet 2013)
- ↑ (en) « Chrome 28 Beta: A more immersive web, everywhere », Google (consulté le 6 juillet 2013)
- ↑ (en) https://github.com/kripken/emscripten
- ↑ (en) Alon Zakai et Robert Nyman, « Gap between asm.js and native performance gets even narrower with float32 optimizations », (consulté le 11 avril 2014) : « Firefox with float32 optimizations can run all those benchmarks at around 1.5× slower than native, or better »
- ↑ (en) « Lua REPL »
- ↑ (en) « plu » (Archive • Wikiwix • Archive.is • Google • Que faire ?)
- ↑ (en) « repl.it - Python »
- ↑ (en) « emscripten-qt - Demos »
- ↑ (en) « Vim.js - portage Javascript de Vim »
- ↑ (en) « Port of SQLite to Javascript »
- ↑ (en) « Epic Games Releases ‘Epic Citadel’ on the Web », Epic Games,
- ↑ (en) « Unreal Engine 3 ported to JavaScript and WebGL, works in any modern browser », ExtremeTech
- ↑ (en) « On the future of Web publishing in Unity »,
- ↑ (en) http://kripken.github.io/boon/boon.html
- ↑ (en) http://forandom.github.io/WebSupertux/
- ↑ (en) http://clb.demon.fi/html5scummvm/
- ↑ (en) http://play-dune.com/
- ↑ (en) « Mozilla Banana Bread Demo »
- ↑ (en) « Humble Mozilla Bundle pushes WebGL-powered browser gaming », Ars Technica, (consulté le 15 octobre 2014)
- ↑ (en) http://jsmess.textfiles.com/
- ↑ (en) « HTML5 Fractal Playground »
Liens externes
- (en) Documentation
- (en) Asm.js sur GitHub
- (en) Asm.js: The JavaScript Compile Target – article par John Resig
- (en) RPerl
- (en) « Statistiques d'usage de Asm.js par Google Chrome » (Archive • Wikiwix • Archive.is • Google • Que faire ?), consulté le 2014-11-24
- Portail de l’informatique