Quindi devo ritenere che la parte interpretata sia un requisito nelle specifiche del linguaggio, o è fuorviante dire che il linguaggio è un linguaggio di programmazione interpretato nel rispetto della differenza tra un linguaggio e le sue numerose implementazioni?
I fanatici del linguaggio EcmaScript usano spesso il termine "interprete ES" per fare riferimento a un'implementazione di EcmaScript, ma le specifiche non usano quel termine. La panoramica della lingua in particolare descrive la lingua in termini di interprete-agnostico:
ECMAScript è basato su oggetti: il linguaggio di base e le strutture host sono fornite da oggetti e un programma ECMAScript è un cluster di oggetti comunicanti.
Quindi EcmaScript presuppone un "ambiente host" che viene definito come fornitore di definizioni di oggetti, compresi tutti quelli che consentono I / O o qualsiasi altro collegamento con il mondo esterno, ma non richiede un interprete.
La semantica delle dichiarazioni e delle espressioni nel linguaggio è definita in termini di specifiche di completamento che sono banalmente implementate in un interprete, ma le specifiche non lo richiedono.
8.9 Il tipo di specifica di completamento
Il tipo di completamento è utilizzato per spiegare il comportamento di istruzioni ( break
, continue
, return
e throw
) che eseguono trasferimenti non locali di controllo. I valori del tipo Completamento sono triple del modulo ( tipo , valore , destinazione ), dove il tipo è normale , interrompi , continua , restituisce o genera , il valore è qualsiasi valore del linguaggio ECMAScript o vuoto e il target è qualsiasi identificatore ECMAScript o vuoto .
Il termine "completamento improvviso" si riferisce a qualsiasi completamento con un tipo diverso dal normale .
I trasferimenti di controllo non locali possono essere convertiti in matrici di istruzioni con salti che consentono la compilazione nativa o con codice byte.
"EcmaScript Engine" potrebbe essere un modo migliore per esprimere la stessa idea.
Apparentemente non ci sono compilatori statici per JavaScript
Questo non è vero. L '"interprete" V8 compila internamente il codice nativo, Rhino facoltativamente compila internamente il bytecode Java e vari interpreti Mozilla ({Trace, Spider, Jager} Monkey) usano un compilatore JIT.
V8 :
V8 aumenta le prestazioni compilando JavaScript nel codice macchina nativo prima di eseguirlo, anziché eseguire bytecode o interpretarlo.
Rhino :
public final void setOptimizationLevel(int optimizationLevel)
Imposta il livello di ottimizzazione corrente. Il livello di ottimizzazione dovrebbe essere un numero intero compreso tra -1 e 9. Qualsiasi valore negativo verrà interpretato come -1 e qualsiasi valore maggiore di 9 verrà interpretato come 9. Un livello di ottimizzazione -1 indica che la modalità interpretativa sarà sempre Usato. I livelli da 0 a 9 indicano che è possibile generare file di classe. Livelli di ottimizzazione più elevati compromettono le prestazioni in fase di compilazione per le prestazioni di runtime. Il livello di ottimizzatore non può essere impostato maggiore di -1 se il pacchetto di ottimizzatore non esiste in fase di esecuzione.
TraceMonkey :
TraceMonkey aggiunge la compilazione in codice nativo al motore JavaScript® di Mozilla (noto come "SpiderMonkey"). Si basa su una tecnica sviluppata in UC Irvine chiamata "trace alberi" e basata su codice e idee condivisi con il progetto Tamarin Tracing. Il risultato netto è un enorme aumento della velocità sia nel contenuto del browser che nel contenuto della pagina Web.