Je suppose donc que la partie interprétée est une exigence de la spécification du langage ou est-il trompeur de dire que le langage est un langage de programmation interprété dans le respect de la différence entre un langage et ses nombreuses implémentations?
Langage EcmaScript Les geeks utilisent souvent le terme "interprète ES" pour faire référence à une implémentation d'EcmaScript, mais la spécification n'utilise pas ce terme. L’ aperçu de la langue en particulier décrit la langue en termes interprète-agnostique:
ECMAScript est basé sur les objets: le langage de base et les fonctions d’hôte sont fournies par des objets, et un programme ECMAScript est un cluster d’objets communicants.
EcmaScript suppose donc un "environnement hôte" défini en tant que fournisseur de définitions d'objet, y compris toutes celles qui autorisent les E / S ou tout autre lien avec le monde extérieur, mais ne nécessite pas d'interprète.
La sémantique des instructions et des expressions dans le langage est définie en termes de spécification de complétude qui est implémentée de manière triviale dans un interpréteur, mais la spécification ne l'exige pas.
8.9 Le type de spécification d'achèvement
Le type d'achèvement est utilisé pour expliquer le comportement des déclarations ( break
, continue
, return
et throw
) qui effectuent des transferts non locaux de contrôle. Les valeurs du type Completion sont des triples de la forme ( type , valeur , cible ), où type est l'une des valeurs suivantes : normal , pause , continuer , retour ou projection , valeur est n'importe quelle valeur de langage ECMAScript ou vide , et cible est tout identificateur ECMAScript ou vide .
Le terme «achèvement brutal» désigne tout achèvement avec un type autre que normal .
Les transferts de contrôle non locaux peuvent être convertis en tableaux d'instructions avec des sauts permettant une compilation en code natif ou par octet.
"Moteur EcmaScript" pourrait être un meilleur moyen d’exprimer la même idée.
Il n'y a apparemment aucun compilateur statique pour JavaScript
Ce n'est pas vrai. L '"interpréteur" V8 compile en interne en code natif, Rhino en option compile en interne en octetcode Java et divers interprètes de Mozilla ({Trace, Spider, Jager} Monkey) utilisent un compilateur JIT.
V8 :
V8 augmente les performances en compilant JavaScript en code machine natif avant de l'exécuter, par opposition à l'exécution de bytecode ou à son interprétation.
Rhinocéros :
public final void setOptimizationLevel(int optimizationLevel)
Définissez le niveau d'optimisation actuel. Le niveau d'optimisation devrait être un entier compris entre -1 et 9. Toute valeur négative sera interprétée en tant que -1 et toute valeur supérieure à 9 sera interprétée en 9. Un niveau d'optimisation de -1 indique que le mode d'interprétation sera toujours utilisé. Les niveaux 0 à 9 indiquent que des fichiers de classe peuvent être générés. Des niveaux d’optimisation plus élevés compromettent les performances de temps de compilation et d’exécution. Le niveau d'optimisation ne peut pas être supérieur à -1 si le package d'optimiseur n'existe pas au moment de l'exécution.
TraceMonkey :
TraceMonkey ajoute la compilation de code natif au moteur JavaScript® de Mozilla (connu sous le nom de «SpiderMonkey»). Il est basé sur une technique mise au point par l’UC Irvine, appelée «arbre à traces», et repose sur le code et les idées partagés avec le projet Tamarin Tracing. Le résultat net est une augmentation massive de la vitesse du contenu du navigateur et du contenu des pages Web.