9
votes

JavaScript est-il analysé / interprété sur la charge? (C'EST À DIRE)

Je sais, par exemple, que lorsque Chrome télécharge un fichier JavaScript, il est interprété et jité.

Ma question est, quand IE6,7,8, téléchargez d'abord un fichier JavaScript, est la chose entière analysée et interprétée?

Ma compréhension était que seules les signatures de fonction de haut niveau et que tout ce qui soit exécuté dans la portée mondiale a été analysée sur la charge. Puis les organes de fonction et le reste ont été analysés sur l'exécution.

S'ils sont complètement analysés sur la charge, que pensez-vous que les économies de temps seraient sur le report des organes de fonction à être téléchargés et analysés plus tard?


2 commentaires

Petit Nitpick, Ehm Je veux dire Correction: V8 JAMAIS interprète, c'est TOUJOURS compile au code natif. Il n'est même pas d'un interprète, seulement un compilateur de code natif.


@ Jörg W Mittag Oui, je suppose que je suppose: analyser / interpréter / exécuter. Ces deux sont essentiellement les mêmes: interpréter / exécuter


4 Réponses :


5
votes

Ils sont complètement analysés sur la charge. (C'est-à-dire qu'il faut analyser le script pour savoir où chaque corps de fonction se termine, bien sûr.) Dans les implémentations à source ouverte, chaque fonction est compilée à la même heure et même au code de la machine en même temps, et j'imagine que c'est-à-dire fonctionne de la même manière. .

Si vous avez une page en train de charger trop lentement, vous pouvez différer Chargement de 100k de script que vous n'allez probablement pas utiliser, cela pourrait aider vos temps de charge. Ou ne pas voir la mise à jour ci-dessous.

(Trivia: Les repères JS comme SunSpider ne mesurent généralement pas le temps nécessaire pour analyser et compiler le code.)

mise à jour - Depuis que j'ai posté cette réponse, les choses ont changé! Les implémentations analysent toujours chaque script sur la charge au moins suffisamment pour détecter toute syntaxeRors, selon les besoins de la norme. Mais ils différencient parfois des fonctions de compilation jusqu'à ce qu'ils soient appelés pour la première fois.


1 commentaires

Le code source SPiderMonkey est ici . Notez que la classe d'analyse est un modèle qui peut produire une AST, pour la compilation immédiate ( analyseur ) ou ne détecte que les erreurs de syntaxe ( Parser ). Lorsqu'une fonction qui n'a pas été compilée n'est appelée à l'exécution, JS :: frontend :: compilelazunction est appelé.



2
votes

Oui, sur tous les navigateurs Le téléchargement de la ressource bloque tout le reste de la page (téléchargement de CSS, autres téléchargements JS, rendu) S'il est fait avec un