Developpez.com

Le Club des Développeurs et IT Pro

dart2js traduit du code Dart en JavaScript

Qui serait plus performant que son équivalent idiomatique, le langage de Google évolue

Le 2013-04-11 13:25:19, par Cedric Chevalier, Expert éminent sénior
Une nouvelle version du compilateur dart2js est disponible. Pour rappel, ce dernier permet de convertir en JavaScript du code Dart.

Le nouveau dart2js permet de produire du code JavaScript plus compact et rapide grâce notamment à une innovation inédite appelée « global type inferencing ». Avec cette dernière, le compilateur en analysant entièrement du code Dart, produit un équivalent JavaScript plus compact et performant, dans lequel sont éliminées les lignes contenant les mots clés « Bailout », « typeof » ajoutées par l’ancien compilateur. De plus, ce nouveau compilateur change les boucles While en boucles For et les appels de fonctions sont remplacés par les champs d’accès.

Par ailleurs, on note également que dart2js gère mieux les dépassements de capacité de liste. En effet, là où JavaScript retourne une valeur indéfinie, Dart lève une exception qui sera utilisée par le compilateur pour générer un code qui avertirait le programmeur si celui-ci voulait avoir accès à un élément d’une liste de rang supérieur à sa taille totale.

En outre, des bancs d’essai ont été réalisés avec du code JavaScript généré par ce nouveau compilateur et leur équivalent idiomatique dans le moteur JavaScript V8 de Google. Il en ressort que le code généré par le compilateur est un poil plus performant que son équivalent idiomatique.


Nicolas Geoffray, contributeur du projet dart2js montre dans une vidéo de nombreux exemples de code Dart traduit en JavaScript par l’ancien compilateur et le nouveau avec son innovation inédite.

[ame="http://www.youtube.com/watch?v=rbLkYlbEZ1E"]Dart2js[/ame]

L’objectif de Google avec Dart est de proposer une alternative au langage JavaScript, qui offre la même flexibilité que celui-ci, mais qui se distingue par son typage fort et optionnel. Il est vu comme un JavaScript-killer. Mozilla propose également asm.js, un sous-ensemble restreint du JavaScript qui écarte tous les éléments complexes qui limitent les possibilités d'optimisation. Quant à Microsoft, TypeScript a été développé comme un sur-ensemble de JavaScript pour l’optimiser.

Preuve que JavaScript a de gros manquements, mais demeure cependant un langage clé ?

Le projet Dart sur GitHub

Source : Google
  Discussion forum
290 commentaires
  • ptah35
    Membre éclairé
    Envoyé par ugo-sans-h
    [...] je trouve simplement que Javascript n'évolue pas assez avec sont temps et l'utilisation que l'on en fait aujourd'hui. Sont approche n'a pas changé depuis des années, hors, notre approche du web elle a beaucoup évoluée. Hier javascript servait à gérer trois onclick, aujourd'hui on développe des Web App qui concurrencent directement les applications lourdes.
    Il existe aujourd'hui un nombre incalculable de langages de programmation, mais les paradigmes et les concepts qui sont mis en œuvre dans ces langages sont en nombre limités et la plupart ont été inventés entre la fin des années 50 et le début des années 70. Le fait de "ne pas évoluer avec son temps" est donc une critique que l'on pourrait adresser à n'importe quel langage.

    Le fait que JavaScript ait été utilisé pour gérer "trois onclick" n'implique pas qu'il ait été développé avec cette seule ambition. En effet, JavaScript, qui devait à l'origine s'appeler LiveScript, était destiné à devenir un langage de script pour le serveur http "Netscape Entreprise Server" et si son nom contient le terme "script", ce n'est pas parce qu'il s'agit d'un langage de programmation au rabais, mais parce qu'il est destiné un environnement d'exécution particulier (en l'occurrence un navigateur). Le fait que des applications concurrençant des « applications lourdes » aient pu être réalisées, montre d’une part les progrès qu’ont fait le html et les navigateurs et, d’autre part, que JavaScript est un vrai langage de programmation.

    Tous les langages de programmation ont été développés pour permettre la création d'abstractions pour que les programmeurs puissent plus facilement gérer la complexité des programmes. Les variables, les procédures, les fonctions, les modules, les classes sont autant de moyens permettant la création d'abstractions. JavaScript n'utilise ni classe ni module, mais cela ne signifie pas qu'il ne dispose pas de moyens puissant pour créer des abstraction. En JavaScript, le principal moyen d'abstraction est la fonction qui est, dans ce langage, un objet de première classe (first-class citizen) et une fermeture (closure).

    Si l'on aborde JavaScript en espérant y trouver les même concepts qu'en Java ou qu'en C#, il est évident que l'on risque d'être déçu, et je pense que si ce langage a une si mauvaise réputation, ce n'est pas tant à cause de ses défauts bien connus, mais plutôt à cause de programmeurs déçus de ne pas trouver dans ce langage ce qu'ils espéraient y trouver et qui n'ont pas voulu ou pas pu faire l'effort de regarder ce qu'il avait à offrir.

    Même si un autre langage remplace un jour JavaScript dans les navigateurs, il reste pour l’heure le lingua franca des navigateurs et en tant que tel, le seul langage utilisable pour réaliser la partie cliente d’une application Web, il convient donc de l’apprendre lorsque l’on se considère comme un professionnel du Web. Cela étant dit, puisque tous les langages de programmation Turin-complet sont équivalents, il es possible de compiler n’importe quel langage en JavaScript et c’est une très bonne chose que de tels compilateurs existent. Si donc vous êtes plus à l’aise avec un autre langage, utilisez-le, mais ne dénigrez pas JavaScript parce qu’il ne correspond pas à vos attentes.

    « Tout le monde est un génie. Mais si vous jugez un poisson sur ses capacités à grimper à un arbre, il passera sa vie à croire qu’il est stupide » (Albert Einstein)
  • tomlev
    Rédacteur/Modérateur
    Envoyé par DarkSeiryu
    Mais je me demande quand même, quel est l'intérêt de coder en autre chose qu'en JS si au final le compilo' met tout en JS pour être exécuté dans le navigateur ?
    Moi je me demande quel est l'intérêt de coder en autre chose qu'en assembleur, puisqu'au final le compilateur ou la machine virtuelle convertit tout en langage machine...
    Javascript est l'assembleur du web
  • _skip
    Expert éminent
    Envoyé par Uther

    Quand je fais une application classique, c'est quand même bien agréable de pouvoir choisir le langage le plus adapté. Heureusement, maintenant, il y a des langages qui compilent vers Javascript, avec même des performances supérieure à du Javascript qui aurait été fait main, ce qui en dit long sur la "puissance" du langage.
    Perso ça me fait penser que dans un monde idéal, le javascript ne serait pas un langage mais un bytecode du style de celui qui est avalé par la JVM. Càd des opérations simples, moins difficiles à implémenter et à optimiser pour les browsers et des langages qui compilent vers ce bytecode commun.

    Parce que de fait, c'est à cela qu'on vient avec des dart2js, des asm.js, des coffeescript et autre. Bientôt la seule vraie différence ce sera qu'au lieu de compiler vers du bytecode, on le fera vers un sous-ensemble optimisé de javascript.
  • LSMetag
    Expert confirmé
    Envoyé par DarkSeiryu
    Salut à tous.

    Alors, je n'ai jamais testé Dart et je fais pas mal de JS donc je ne sais pas du tout ce que ça donne.
    Mais je me demande quand même, quel est l'intérêt de coder en autre chose qu'en JS si au final le compilo' met tout en JS pour être exécuté dans le navigateur ? Parce que OK, Dart est dit plus simple à coder/debugger que JS, mais au final faut rajouter au temps d'exécution du JS, le temps de compilation en JS...
    D'après moi, ça perd de son intérêt quand même.
    Alors, il y a plusieurs intérêts. D'une part oui le gain de productivité et de "fun" est indéniable (sauf si tu maîtrise et aime javascript).
    Deuxièmement, pour les gens pas forcément experts en javascript, le code généré est quand même de qualité. Dans certains cas, il est plus performant que du natif.
    Enfin, le Dart n'est pas dynamiquement compilé en Javascript au chargement de la page. C'est à la compilation (dans l'IDE) qu'il est généré en Javascript, et c'est ce Javascript qu'il faudra déployer. Le Dart ne sert vraiment qu'au développement (sauf en utilisant la machine virtuelle Dart (uniquement dans Chrome) où là il explose Javascript).

    Donc, si tu es expert en Javascript, ça aura sûrement peu d'intérêt, car tu sauras sûrement optimiser mieux que Dart2JS et tu ne galèreras pas comme beaucoup. Le problème c'est que j'ai l'impression que dans notre milieu, être expert en Javascript n'est pas très courant. Donc pour la maintenabilité, ça peut être utilise aussi.
  • Uther
    Expert éminent sénior
    Envoyé par BPiero
    Cependant, cette apparente faiblesse (voir complexité inutile) se révélera être d'une puissance redoutable pour le développeur qui est prêt a réapprendre ce qu'il croyait savoir sur la programmation. Bien sûr beaucoup vont me moinser (, mais je m'en fout, ça ne m’empêchera pas de dire la vérité), car ils ne sont pas prêts a admettre qu'un langage de script permissif et simple d'accès au départ puisse être puissant.
    Tout dépend la définition que l'on se donne de "puissant", car au premier abord, ça ne veux pas dire grand chose.

    Personnellement des que quelqu'un me parle d'un langage en me disant qu'il est puissant, j'ai peur. Car en général, il entend que le langage leurs évite de réfléchir à certains problèmes par magie, ce qui finit généralement par ce traduire par des performance mauvaises, parce que la magie ça a un coût, ou des comportement déroutants, car la magie, ça a ces limites.
    Bref si on veux aller dans le complexe on se retrouve a apprendre tout le comportement que la magie essayait de cacher et on fini par ce retrouver avec quelque chose d'encore plus complexe que le problème initial.

    Envoyé par BPiero
    Malheureusement pour eux, le JS devient de plus en plus omniprésent, donc ils vont être forcés à terme d'évoluer ou d’arrêter le développement (ou c'est peut-être pour ça qu'ils vont me moinser? comme toujours je préfère dire ce que je pense plutôt que d'éviter les moins, question d'intégrité).
    C'est le problème le plus énervant de JS. On est obligé de l'utiliser (du moins dans un navigateur) non pas parce que c'est un bon langage, mais parce que l'on a pas le choix.
    Quand je fais une application classique, c'est quand même bien agréable de pouvoir choisir le langage le plus adapté. Heureusement, maintenant, il y a des langages qui compilent vers Javascript, avec même des performances supérieure à du Javascript qui aurait été fait main, ce qui en dit long sur la "puissance" du langage.
  • _skip
    Expert éminent
    Envoyé par Golgotha


    Sérieusement : Je ne crois pas un seule instant à ce langage Quoique Apple à bien réussi à mettre en place un langage du même style, et par style j'entends : Un langage élitiste, dont uniquement une poignée de gourou comprennent le fonctionnement, avec un besoin boulimique d'outils propriétaire pour faire tournée le machin, je n'ai qu'un seule demande, si ce machin surpasse une bon vieux Notepad avec de l'HTML et du JS : Filez moi un coup sec derrière la nuque ! On à déjà assez avec l'Objective-C...
    Tout à ma connaissance est open source et plutôt community driven, genre saloperie propriétaire, franchement y'a pire.
    Quant à dire que c'est pour les gourous, c'est probablement moins difficile de relire du dart que du javascript (en tout cas pour moi), qui est un langage facile seulement en apparence (fais le test : tu pièges facilement quelqu'un sur un problème de scope ou de contexte en JS).
  • Uther
    Expert éminent sénior
    Envoyé par r0d
    J'ai parcouru cette passionnante discussion, et j'y ai lu beaucoup de mal à propos de javascript. Je ne connais rien à javascript, ni au développement web en fait, mais je suis curieux de savoir pourquoi javascript a si mauvaise réputation chez les développeurs alors qu'il est tant utilisé. Quelqu'un pourrait me faire un briefing?
    S'il est si utilisé, même par les gens qui le détestent, comme moi, c'est avant tout parce que c'est le seul langage qui peux être utilisé pour exécuter du code coté client, sur tous les navigateurs, sans avoir recours à un plugin.

    Après il a des avantages, comme sa relative simplicité de prise en main, son approche dynamique qui lui permet manipuler facilement le contenu d'une page Web.
    Mais si on veut faire une application lourde, je ne le conseillerais vraiment pas. C'est certes faisable en Javascript, mais des langages plus structurants et performants comme le C++, Java, ... me paraissent clairement plus adaptés.
  • wirenth
    Membre averti
    Envoyé par ugo-sans-h

    Cependant, pour moi, un bon langage est un langage industriel : Travail par composant (package), Objet, design pattern...
    Un langage non objet n'est pas industriel ? C'est vrai que plus personne ne fait du C...
  • frfancha
    Membre éprouvé
    Envoyé par BPiero
    Pour les langages qui compilent vers JS, excuse moi d'être sceptique, mais je vois pas comment on peut faire plus efficient dans ce sens là (ah si, si on code avec les pieds) sinon c'est comme dire que du C++ peut être plus efficient que de l'assembleur.
    BPiero
    D'accord avec toi pour tes réflexions sur Javascript, par contre pour les compilateurs tu as tort: cela fait déjà plus de 20 ans que les bons compilateurs produisent de l'assembleur plus performant que l'humain
  • David_g
    Membre éclairé
    Envoyé par ugo-sans-h
    C'est une partie du problème je pense.

    JS est un langage basé sur le prototypage, mais aujourd'hui on fait de l'objet avec.

    Je ne connais pas les spec de EcmaScript6, c'est possible en effet
    Cependant l'évolution de php est, je trouve, plus dynamique que l'évolution de js.
    C'est là que je vois bien le problème. Il n'y a pas fondamentalement de problème à faire de l'objet à base de prototype. c'est juste une autre manière et c'est pas "aujourd'hui on fait de l'objet avec".

    Cela te gène certes mais c'est un autre débat.

    Note : pas de souci pour reconnaitre tout un tas d'autres problèmes à JS pour information.