Entonces, ¿debo considerar que la parte interpretada es un requisito en la especificación del lenguaje, o es engañoso decir que el lenguaje es un lenguaje de programación interpretado cuando se respeta la diferencia entre un lenguaje y sus múltiples implementaciones?
Los geeks del lenguaje EcmaScript a menudo usan el término "intérprete de ES" para referirse a una implementación de EcmaScript, pero la especificación no usa ese término. El resumen del lenguaje en particular describe el lenguaje en términos independientes del intérprete:
ECMAScript está basado en objetos: los objetos proporcionan lenguaje básico y servicios de host, y un programa ECMAScript es un grupo de objetos en comunicación.
Por lo tanto, EcmaScript asume un "entorno host" que se define como un proveedor de definiciones de objetos, incluidos todos aquellos que permiten E / S o cualquier otro enlace al mundo exterior, pero no requiere un intérprete.
La semántica de las declaraciones y expresiones en el lenguaje se define en términos de especificación de finalización que se implementan trivialmente en un intérprete, pero la especificación no requiere eso.
8.9 El tipo de especificación de finalización
El tipo de finalización se utiliza para explicar el comportamiento de los estados ( break
, continue
, return
y throw
) que realizan las transferencias no locales de control. Los valores del tipo de Finalización son triples de la forma ( tipo , valor , objetivo ), donde el tipo es uno de normal , interrumpir , continuar , devolver o arrojar , el valor es cualquier valor del lenguaje ECMAScript o está vacío , y el objetivo es cualquier identificador ECMAScript o vacía .
El término "finalización abrupta" se refiere a cualquier finalización con un tipo diferente al normal .
Las transferencias de control no locales se pueden convertir en matrices de instrucciones con saltos que permiten la compilación nativa o de código de bytes.
"Motor EcmaScript" podría ser una mejor manera de expresar la misma idea.
Aparentemente no hay compiladores estáticos para JavaScript
Esto no es verdad. El "intérprete" V8 compila el código nativo internamente, Rhino compila opcionalmente el código de bytes de Java internamente y varios intérpretes de Mozilla ({Trace, Spider, Jager} Monkey) usan un compilador JIT.
V8 :
V8 aumenta el rendimiento compilando JavaScript en código máquina nativo antes de ejecutarlo, en lugar de ejecutar bytecode o interpretarlo.
Rinoceronte :
public final void setOptimizationLevel(int optimizationLevel)
Establecer el nivel de optimización actual. Se espera que el nivel de optimización sea un número entero entre -1 y 9. Cualquier valor negativo se interpretará como -1, y cualquier valor mayor que 9 se interpretará como 9. Un nivel de optimización de -1 indica que el modo interpretativo siempre será usado. Los niveles del 0 al 9 indican que se pueden generar archivos de clase. Los niveles de optimización más altos compensan el rendimiento en tiempo de compilación por el rendimiento en tiempo de ejecución. El nivel del optimizador no puede establecerse en más de -1 si el paquete del optimizador no existe en tiempo de ejecución.
TraceMonkey :
TraceMonkey agrega compilación de código nativo al motor JavaScript de Mozilla (conocido como "SpiderMonkey"). Se basa en una técnica desarrollada en UC Irvine llamada "árboles traza", y se basa en el código y las ideas compartidas con el proyecto Tamarin Tracing. El resultado neto es un aumento masivo de velocidad tanto en el navegador Chrome como en el contenido de la página web.