Developpez.com

Le Club des Développeurs et IT Pro

Les virgules bloquent Twitter sur Opera

Est-il logique d'optimiser le code JavaScript en remplaçant point virgule par virgule ?

Le 2012-07-20 16:43:52, par Hinault Romaric, Responsable .NET
Hallvord Steen un développeur de l’équipe en charge du navigateur Opera a récemment constaté que le site Twitter ne fonctionnait pas avec la version finale d’Opera 12.

Le problème serait dû à une erreur lors de la compilation du code JavaScript par le compilateur du navigateur.

Après investigation, Steen s’est rendu compte que le compilateur devait analyser un énorme fichier de près de 4 129 653 caractères. Mais, le problème ne serait pas au niveau de la taille du fichier ou du nombre de caractères, mais plutôt dû au fait que les virgules soient utilisées en lieu et place des points virgules, rendant pratiquement les 4 millions de caractères comme une seule instruction JavaScript.

Il s’avère pourtant que l’analyseur de code d’Opera dispose d’une limite pour une instruction JavaScript. Ce qui entraine l’échec de la compilation, et ne permet pas de ce fait à Twitter de s’afficher normalement.

L’utilisation de la virgule à la place du point virgule présente-t-elle un avantage, ou permet–elle d’optimiser le code JavaScript ? Steen, pour sa part, n’encourage pas le recours à cette syntaxe. « La virgule présente des inconvénients comme la génération d’un code beaucoup plus difficile à compiler par plusieurs compilateurs JavaScript actuels » note Steen.

Cependant, les sites s’orientent de plus en plus vers cette syntaxe. « J’ai vu quelques sites utiliser des virgules à la place des points virgules dans leur code JavaScript récemment. Pourquoi cette mode, ça me dépasse », regrette Steen.

Un correctif est néanmoins disponible pour Opera, permettant de résoudre ce problème avant que cela ne soit réglé dans le compilateur JavaScript du navigateur. Le correctif permet juste d’ajouter un point virgule dans le script avant que la limite ne soit atteinte.

Utiliser le correctif

Source : Blog Hallvord Steen

Et vous ?

Qu’en pensez-vous ? Est-ce une façon d’optimiser le code JavaScript ? Si oui, est-elle logique ?
  Discussion forum
43 commentaires
  • poringkiller
    Membre du Club
    la virgule est un opérateur javascript, toutes les sorties sauf la dernière sont ignorées, ainsi
    var temp = 9,8;
    console.log(temp);
    écrira 8.
    Ce n'est pas une mode, c'est bel et bien une manière d'optimiser le code. Certains compilateurs executent le code plus vite, comme certaines sorties sont ignorées, mais on peut voir que ça en fait planter d'autres.
  • Latios
    Membre à l'essai
    Steen s’est rendu compte que le compilateur devait analyser un énorme fichier de près de 4 129 653 caractères.
    4 Mo ? Y'a un fichier Javascript de 4 Mo sur Twitter ? :o
  • Paul TOTH
    Expert éminent sénior
    je ne connaissais que cet usage

    Code :
    1
    2
    3
     for (i = j = 0; i < 10; i++, j+=2) {
     }
  • rt15
    Membre éclairé
    Envoyé par thelvin
    Et ça ne résout pas le problème. Les processeurs différents ont des caches différents. Si l'un d'eux indique dans son cache que la mémoire est libérée et que le pointeur est NULL, l'autre ne le verra pas dans le sien. Et ces deux informations peuvent porter sur plusieurs parties du cache : l'une peut être vue avant l'autre (et même pas dans le bon ordre.)
    Sans aucune instruction de synchronisation de cache, il n'y a pas de solution.
    Non pas de souci à ce niveau tout du moins sur PC. Si on écrit quelque chose à l'adresse X, alors toute lecture de la même adresse depuis un autre thread s'exécutant sur un autre coeur (Du même processeur ou d'un autre) renvoie bien la valeur qui vient d'être écrite.
    Cela est dû au fait que la cohérence des caches est garantit sur les x86 au niveau hardware. Les constructeurs utilisent des protocoles de cohérence de cache. Papier sur le sujet ici.
  • Uther
    Expert éminent sénior
    Qu'une seule chose à dire:
  • _NiTo_
    Membre du Club
    débile...

    Un semblant d'explication que j'ai pu voir sur le blog opera: http://blog.vjeux.com/2011/javascrip...mma-trick.html

    Ceci-dit, ça n'excuse pas vraiment une "ligne" instruction de 1048 virgules...
  • Uther
    Expert éminent sénior
    La virgule n'est pas un séparateur d'instruction mais un opérateur dans une expression comme l'explique poringkiller. Ça fait en effet partie de la spécification du langage. C'est un héritage de C, C++ et la plupart des langages qui ont une syntaxe qui en dérive.

    Du coup des petits malins qui ne voient pas la différence ce sont dit que ça pouvait être une bonne idée de remplacer violemment ";" par ",". Mais bon avoir une seule instruction de 4Mo, faut pas s'étonner que l'interpréteur ait du mal à le digérer.
  • Uther
    Expert éminent sénior
    L'opération "," consiste à retourner la valeur du dernier opérande.

    Par exemple : i = 6 + (1, 4) / 2; assigera 8 à la variable "i". L'opération 1, 4 retourne 4.

    Pour te convaincre que c'est bien un opérateur regarde le tableau de précédence des opérateurs. Il est vrai cependant que cet opérateur a une utilité douteuse qui fait que peu de gens connaissent son existante.
  • Paul TOTH
    Expert éminent sénior
    au temps pour moi
    http://en.wikipedia.org/wiki/Comma_operator

    il n'en reste pas moins que c'est donc d'un usage valide...il me reste l'interrogation sur la taille du JS
  • camus3
    Membre éprouvé
    Attention à ne pas confondre optimisation et minification .

    La minification en soit ne rend pas l’exécution du code plus rapide ( à part le parsing du fichier peut être , et encore , ce n'est même pas sur ). En tout cas , elle ne rend pas un algo plus efficient c'est clair.

    Maintenant , des compilateurs tels que le closure compiler modifient carrément la logique du code , et transforme certaines boucles par exemple en des boucles soit disant plus "optimisées".