¿Debo entender 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 spec No usa ese término. La descripción general del idioma en particular describe el idioma en términos de intérprete:
ECMAScript se basa en objetos: el lenguaje básico y las instalaciones de host son proporcionados por objetos, y un programa ECMAScript es un grupo de objetos en comunicación.
EcmaScript asume un "entorno de host" que se define como un proveedor de definiciones de objetos, incluidos todos aquellos que permiten I / O 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 definen en términos de especificación de finalización que se implementan de forma trivial 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 usa para explicar el comportamiento de las declaraciones ( break
, continue
, return
y throw
) que realizan transferencias de control no locales. Los valores del tipo de Compleción son triples del formulario ( tipo , valor , destino ), donde tipo es uno de normal , interrupción , continuar , devolver o lanzar , valor es cualquier valor de lenguaje ECMAScript o vacío , y destino es cualquier identificador de ECMAScript o vacío .
El término "finalización abrupta" se refiere a cualquier finalización con un tipo que no sea normal .
Las transferencias de control no locales se pueden convertir en arreglos de instrucciones con saltos que permiten la compilación de código nativo o de byte.
"Motor EcmaScript" puede ser una mejor manera de expresar la misma idea.
Aparentemente no hay compiladores estáticos para JavaScript
Esto no es cierto. El "intérprete" de V8 compila internamente el código nativo, Rhino opcionalmente compila internamente el código de bytes de Java y varios intérpretes de Mozilla ({Trace, Spider, Jager} Monkey) usan un compilador JIT.
V8 :
V8 aumenta el rendimiento al compilar JavaScript en el código de máquina nativo antes de ejecutarlo, en lugar de ejecutar el bytecode o interpretarlo.
Rhino :
public final void setOptimizationLevel(int optimizationLevel)
Establezca 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 para el rendimiento en tiempo de ejecución. El nivel del optimizador no se puede establecer en más de -1 si el paquete del optimizador no existe en el 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 de 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 la velocidad tanto en el contenido de Chrome como en el de la página web.