Então, devo considerar que a parte interpretada é um requisito na especificação da linguagem ou é enganoso dizer que a linguagem é uma linguagem de programação interpretada quando se respeita a diferença entre uma linguagem e suas muitas implementações?
Os geeks da linguagem EcmaScript costumam usar o termo "intérprete de ES" para se referir a uma implementação do EcmaScript, mas a especificação não usa esse termo. A visão geral do idioma, em particular, descreve o idioma em termos agnósticos de intérpretes:
O ECMAScript é baseado em objetos: recursos básicos de host e linguagem são fornecidos por objetos, e um programa ECMAScript é um cluster de objetos em comunicação.
Portanto, o EcmaScript assume um "ambiente host" que é definido como um provedor de definições de objetos, incluindo todos aqueles que permitem E / S ou quaisquer outros links para o mundo externo, mas não exigem um intérprete.
A semântica de instruções e expressões na linguagem é definida em termos de especificação de conclusão que são implementadas trivialmente em um intérprete, mas a especificação não exige isso.
8.9 O tipo de especificação de conclusão
O tipo de conclusão é usada para explicar o comportamento de declarações ( break
, continue
, return
e throw
) que efectue transferências não-locais de controle. Os valores do tipo Conclusão são triplos no formato ( tipo , valor , destino ), em que tipo é normal , valor de interrupção , continuação , retorno ou lançamento , valor é qualquer valor do idioma ECMAScript ou vazio , e destino é qualquer identificador ECMAScript ou vazio .
O termo "conclusão abrupta" refere-se a qualquer conclusão com um tipo diferente do normal .
As transferências de controle não locais podem ser convertidas em matrizes de instruções com saltos, permitindo a compilação nativa ou de código de bytes.
"Mecanismo EcmaScript" pode ser a melhor maneira de expressar a mesma idéia.
Aparentemente, não há compiladores estáticos para JavaScript
Isso não é verdade. O "intérprete" da V8 compila internamente o código nativo, o Rhino opcionalmente compila internamente o bytecode Java e vários intérpretes Mozilla ({Trace, Spider, Jager} Monkey) usam um compilador JIT.
V8 :
A V8 aumenta o desempenho compilando o JavaScript no código da máquina nativo antes de executá-lo, em vez de executar o bytecode ou interpretá-lo.
Rinoceronte :
public final void setOptimizationLevel(int optimizationLevel)
Defina o nível de otimização atual. Espera-se que o nível de otimização seja um número inteiro entre -1 e 9. Quaisquer valores negativos serão interpretados como -1 e quaisquer valores maiores que 9 serão interpretados como 9. Um nível de otimização de -1 indica que o modo interpretativo será sempre usava. Os níveis de 0 a 9 indicam que os arquivos de classe podem ser gerados. Níveis mais altos de otimização compensam o desempenho do tempo de compilação pelo desempenho do tempo de execução. O nível do otimizador não pode ser definido como maior que -1 se o pacote do otimizador não existir no tempo de execução.
TraceMonkey :
O TraceMonkey adiciona compilação de código nativo ao mecanismo JavaScript® da Mozilla (conhecido como “SpiderMonkey”). Baseia-se em uma técnica desenvolvida na UC Irvine chamada “trace trees” e com base em código e idéias compartilhadas com o projeto Tamarin Tracing. O resultado líquido é um enorme aumento de velocidade, tanto no cromo do navegador quanto no conteúdo da página da Web.