Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

asm.js s'approche des performances du code natif C/C++
Mozilla optimise son sous-ensemble de JavaScript

Le , par Hinault Romaric

28PARTAGES

4  2 
JavaScript jouit d’une grande popularité. Le langage de script est devenu une plateforme incontournable pour le Web.

Cependant, il souffre de quelques faiblesses, notamment ses performances par rapport aux langages de développement d’applications natives.

Pour pallier à cela, Mozilla a développé asm.js, un sous-ensemble de JavaScript, dont le but est de maximiser les performances du langage de script pour le Web.

D’après la description de Mozilla, asm.js est – purement - du code JavaScript « spécialement conçu », qui est compilé en langage natif C/C++ avec emscripten avant exécution. Avec asm.js, les développeurs peuvent écrire du code C/C++ et l’exécuter dans le navigateur grâce à emscripten.

Initialement, le code asm.js exécuté avec un navigateur standard comme Chrome pouvait être dix fois plus lent que du code natif. Grâce à des optimisations, la fondation Mozilla avait réussi à rendre le code asm.js environ trois fois plus lent que du code natif en février, et deux fois plus lent en juin.

L’organisme ne s’est pas arrêté en si bon chemin, et dévoile aujourd’hui les nouvelles performances de sa solution. Grâce à des changements apportés à la façon dont les virgules flottantes sont manipulées, asm.js est désormais au pire lent de 1,5 fois par rapport au natif.


asm.js pour fonctionner dans un navigateur nécessite un support explicite du moteur JavaScript. Depuis Firefox 22, Mozilla a activé le support de asm.js dans son moteur SpiderMonkey.

Source : Mozilla

Et vous ?

Que pensez-vous de asm.js ?

Une erreur dans cette actualité ? Signalez-le nous !

Avatar de jojosbiz
Membre habitué https://www.developpez.com
Le 24/12/2013 à 9:50
Oué, c'est bien ce que je pensai..

On en revient à essayer de faire entrer un triangle dans un rond avec un marteau tout en se persuadant que le triangle finira bien par devenir un rond...
9  0 
Avatar de Uther
Expert éminent sénior https://www.developpez.com
Le 24/12/2013 à 9:38
Citation Envoyé par Hinault Romaric
D’après la description de Mozilla, asm.js est – purement - du code JavaScript « spécialement conçu », qui est compilé en langage natif C/C++ avec emscripten avant exécution. Avec asm.js, les développeurs peuvent écrire du code C/C++ et l’exécuter dans le navigateur grâce à emscripten.
En fait c'est tout le contraire.
Le code asm.js n'est pas compilé en C/C++, mais directement en code machine et enscriptem ne permet pas du tout d'exécuter du javascript.

C'est le code C/C++ qui est compilé via enscriptem en code javascript simplifié(asm.js). Cette opération est faite par le développeur qui intègrera le code généra sur son site, pas par le navigateur.
Ce code javascript pourra donc etre chargé et executé de manière efficace par tous les navigateurs. Cependant sur les navigateurs optimisés pour le asm.js, il est compilé en code machine en AOT (en une seule fois contrairement au JIT qui est compilé a la volée) ce qui permet des performances proches du natif.

Citation Envoyé par Faridsarl
moi je dis juste qu'avec le temps, Mozilla reussira a reduire la lenteur a 0 avec un peu plis d'efforts.
0 surcout, certainement pas. Il restera des choses que le JS même limité ne pourra jamais faire aussi vite que du natif. De plus la phase de compilation JS -> natif coûte quand même un peu de temps par rapport a du déjà pré-compilé. Mais descendre au pire à 1.5x la vitesse du natif est déjà un excellent point.
S'il arrivaient à descendre à 1.2x, ça serait déjà énorme.
Citation Envoyé par jojosbiz

Pas compris du tout l’intérêt de tout ça.

Quelqu'un est-il capable de me l'expliquer ?
Il y a pas mal d’intérêts, notamment:
- Pouvoir faire des applications web efficace avec des performances proches du natif.
- Pouvoir développer des applications web avec des langages plus structurés que le Javascript
- Pouvoir réutiliser facilement les nombreux code C/C++ utilisés dans les application bureau pour des applications web
3  0 
Avatar de Uther
Expert éminent sénior https://www.developpez.com
Le 25/12/2013 à 16:39
Citation Envoyé par jojosbiz Voir le message
On en revient à essayer de faire entrer un triangle dans un rond avec un marteau tout en se persuadant que le triangle finira bien par devenir un rond...
En effet, mais il faut voir qu'on a pas le choix, JavaScript étant le seul langage nativement reconnu par tous les navigateurs. L'idéal aurait été un bytecode standardisé, malheureusement ça n'est pas prêt d'arriver.

Citation Envoyé par dk Voir le message
Si tous les navigateurs le prennent en charge aussi efficacement, ça va clairement devenir l'avenir du web, les gros atouts étant les performances et la génération à partir de c/c++ ; plus besoin de plugins et/ou machine virtuelle également, donc moins de problèmes de sécurité tout en restant multisupport.
Ca semble bien parti : même si les développeurs de Chrome se refusent de considérer asm.js en tant que vrai sous langage de JavaScript, ils ont introduit dans webkit des optimisations spécifiques a emscripten qui font qu'au final le code qui suit les règles de asm.js bénéficie de ses optimisations.

Citation Envoyé par tralloc Voir le message
Si j'ai bien compris : On code en C ou en C++ puis on le compile.
Ensuite qu'est ce qui se passe ?
A la base emscripten est un backend LLVM qui génère du JavaScript. Cela signifie qu'il permet de compiler en JavaScript tous les langages qui on un frontend LLVM (le plus connu étant étant Clang pour le C/C++).

Donc pour l'intégration c'est le développeur qui compile son code C/C++/D/... en JavaScript une fois pour toute et l’ajoute dans son site. Le navigateur du client l’exécutera comme n'importe quel JavaScript, avec des optimisations si il le supporte.

Citation Envoyé par tralloc Voir le message
Ça fait penser à dart. Je me trompe ?
Les objectifs sont en effet assez semblable : de meilleures performances et pouvoir utiliser des langages plus stricts.

Les moyens sont différents : Dart est un nouveau langage, la où Mozilla propose de choisir son langage qui sera compilé en un JavaScript très optimisable.

Citation Envoyé par tralloc Voir le message
Ensuite comment fais-ton pour accéder aux ressources de la page ?
J'aimerais aussi savoir si on peut coupler ça avec des frameworks comme angularjs
je ne connais angular.js que de nom mais comme asm.js permet de faire des fonctions pont entre le code compilé et le JavaScript classique, je suppose que ça doit être possible.
2  0 
Avatar de DonQuiche
Expert confirmé https://www.developpez.com
Le 24/12/2013 à 16:14
Pour moi l'avenir du web passe soit par asm.js soit par NaCl parce que ce sont les deux solutions significatives qui pourraient nous permettre d'utiliser les langages de notre choix avec des performances natives. On n'a pas besoin d'un langage de plus mais d'une solution neutre comme celles-ci.

Petite préférence tout de même pour NaCl, le poids du code asm.js semble énorme, même compressé.

Citation Envoyé par tralloc Voir le message
Si j'ai bien compris : On code en C ou en C++ puis on le compile. Ensuite qu'est ce qui se passe ?
Tu codes en ce que tu veux et un code javascript est généré. Ce code javascript est licite, 100% compatible mais "bizarre" avec des choses telles que "x|0" ou l'appel à des fonctions "var" ou "box2b" ressemblant à des instructions bytecode.

Ce code tourne sur un navigateur ne supportant pas asm.js. Toutefois, un navigateur asm.js reconnaît que "x|0" contraint x à être un entier, et interprétera box2b et var comme étant des opcodes plutôt que d'appeler ces fonctions. Au final ce code javascript peut facilement être vérifié, être fortement et statiquement typé et être finalement compilé en un code natif très rapide.

Ca fait penser à dart. Je me trompe ?
Dart est un nouveau langage. Asm.js est un bytecode neutre, que l'on peut efficacement utiliser comme cible de compilation pour à peu près n'importe quel langage.

J'aimerais aussi savoir si on peut coupler ça avec des frameworks comme angularjs
Le gros avantage de asm.js est qu'il est prévu pour facilement faire interagir les fonctions javascript avec le code asm.js.
1  0 
Avatar de jojosbiz
Membre habitué https://www.developpez.com
Le 24/12/2013 à 9:12
Pas compris du tout l’intérêt de tout ça.

Quelqu'un est-il capable de me l'expliquer ?
0  0 
Avatar de Skull57
Membre à l'essai https://www.developpez.com
Le 24/12/2013 à 9:41
Pas compris du tout l’intérêt de tout ça.

Quelqu'un est-il capable de me l'expliquer ?
En fait, les applications natives sont celles que tu installes sur l'ordinateur. On espère donc avoir les mêmes performances sur une application web que sur une application bureau.

Un cas concret: Si un jeu tourne à 60FPS sur ton PC, alors, comme c'est sensé être 1.5x plus lent sur le web, le jeu est sensé tourner à 60/1.5=40FPS si tu y joues en HTML5 avec asm.js.

Après, faut voir à quels domaines ça s'applique. Les jeux-vidéos genre crysis envoie du code assembleur directement à la carte graphique, faut voir si le HTML5 permet de telles optimisations... (+ tout ce qui est utilisation/modification du pipeline graphique, mais comme j'ai jamais touché)
0  0 
Avatar de dk
Membre actif https://www.developpez.com
Le 24/12/2013 à 10:19
Que pensez-vous de asm.js ?
Si tous les navigateurs le prennent en charge aussi efficacement, ça va clairement devenir l'avenir du web, les gros atouts étant les performances et la génération à partir de c/c++ ; plus besoin de plugins et/ou machine virtuelle également, donc moins de problèmes de sécurité tout en restant multisupport.
0  0 
Avatar de renoo
Membre éprouvé https://www.developpez.com
Le 24/12/2013 à 11:10
juste une petite remarque emscripten ça permet de compiler du code c/c++ en javascript normal ou en asm.js. les perfs sont meilleurs avec asm.js sous firefox.

Par ailleurs asm.js est un sous ensemble de js ; donc ca marche sur tout les navigateurs mais ca va très vite que sur firefox.
0  0 
Avatar de Orwel
Membre du Club https://www.developpez.com
Le 25/12/2013 à 18:50
Petite préférence tout de même pour NaCl, le poids du code asm.js semble énorme, même compressé.
Mais entre le HTML et NaCl, il y a JS qui effectue le lien. Donc on est toujours contraint d'utiliser du JS, m'a déception concernant cette technologie.

De plus, NaCl est du code compilé. Un comparatif intéressant serait avec PNaCl, qui comme du asm.js, est destiné à être compilé par le navigateur en code natif.
0  0 
Avatar de tralloc
Membre actif https://www.developpez.com
Le 24/12/2013 à 15:32
J'aimerais bien voir des exemples. Ca a l'air très bien.
@Uther pour une fois je n'ai pas compris toutes tes explications.

Si j'ai bien compris : On code en C ou en C++ puis on le compile.
Ensuite qu'est ce qui se passe ?

Comment on intègre ça dans le code ? Comment fais-t-on le lien dans la page html ? On le fait sur le code C compilé (genre dll), ou sur un JS qui passe à la moulinette le code compilé (version simplifiée) généré par le fameux asm.js ?

Ca fait penser à dart. Je me trompe ?

Ensuite comment fais-ton pour accéder aux ressources de la page ?
J'aimerais aussi savoir si on peut coupler ça avec des frameworks comme angularjs
0  1