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 ?
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.
Source : Blog Hallvord Steen
Et vous ?
-
poringkillerMembre du Clubla 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.le 20/07/2012 à 21:02 -
LatiosMembre à l'essaiSteen s’est rendu compte que le compilateur devait analyser un énorme fichier de près de 4 129 653 caractères.le 20/07/2012 à 19:34
-
Paul TOTHExpert éminent séniorje ne connaissais que cet usage
Code : 1
2
3for (i = j = 0; i < 10; i++, j+=2) { }
le 23/07/2012 à 13:10 -
rt15Membre éclairé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.le 24/07/2012 à 11:22 -
UtherExpert éminent séniorQu'une seule chose à dire:le 20/07/2012 à 17:14
-
_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...le 20/07/2012 à 17:52 -
UtherExpert éminent séniorLa 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.le 21/07/2012 à 8:51 -
UtherExpert éminent séniorL'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.le 21/07/2012 à 11:12 -
Paul TOTHExpert éminent séniorau 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 JSle 21/07/2012 à 12:39 -
camus3Membre é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".le 21/07/2012 à 13:28