Developpez.com

Le Club des Développeurs et IT Pro

asm.js s'approche des performances du code natif C/C++

Mozilla optimise son sous-ensemble de JavaScript

Le 2013-12-24 07:21:32, par Hinault Romaric, Responsable .NET
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 ?
  Discussion forum
12 commentaires
  • jojosbiz
    Membre habitué
    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...
  • Uther
    Expert éminent sénior
    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.

    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.
    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
  • Uther
    Expert éminent sénior
    Envoyé par jojosbiz
    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.

    Envoyé par dk
    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.

    Envoyé par tralloc
    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.

    Envoyé par tralloc
    Ç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.

    Envoyé par tralloc
    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.
  • DonQuiche
    Expert confirmé
    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é.

    Envoyé par tralloc
    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.
  • jojosbiz
    Membre habitué
    Pas compris du tout l’intérêt de tout ça.

    Quelqu'un est-il capable de me l'expliquer ?
  • Skull57
    Membre à l'essai
    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é)
  • dk
    Membre actif
    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.
  • renoo
    Membre éprouvé
    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.
  • Orwel
    Membre du Club
    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.
  • tralloc
    Membre averti
    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