Поэтому я должен считать, что интерпретируемая часть является требованием в спецификации языка, или вводить в заблуждение утверждение о том, что язык является интерпретируемым языком программирования, учитывая разницу между языком и множеством его реализаций?
Специалисты по языку EcmaScript часто используют термин «интерпретатор ES» для обозначения реализации EcmaScript, но в спецификации этот термин не используется. Обзор языка , в частности , описывает язык переводчика-агностик условиях:
ECMAScript основан на объектах: базовый язык и средства хоста предоставляются объектами, а программа ECMAScript представляет собой кластер взаимодействующих объектов.
Таким образом, EcmaScript предполагает «хост-среду», которая определяется как поставщик определений объектов, включая все те, которые разрешают ввод-вывод или любые другие ссылки на внешний мир, но не требуют интерпретатора.
Семантика операторов и выражений в языке определяется в терминах спецификации завершения, которые тривиально реализуются в интерпретаторе, но в спецификации это не требуется.
8.9 Тип спецификации завершения
Тип Завершение используется для объяснения поведения операторов ( break
, continue
, return
и throw
) , которые выполняют нелокальные передачу управления. Значения типа Завершение - это тройки формы ( тип , значение , цель ), где типом является одно из следующих: обычное , прерывание , продолжение , возврат или выброс , значение - любое значение языка ECMAScript или пустое , а цель - любой идентификатор ECMAScript или пустой .
Термин «внезапное завершение» относится к любому завершению с типом, отличным от нормального .
Нелокальные передачи управления могут быть преобразованы в массивы инструкций с переходами, позволяющими компилировать собственный или байт-код.
«Механизм EcmaScript» может быть лучшим способом выразить ту же идею.
Там нет статических компиляторов для JavaScript, по-видимому
Это неправда. «Интерпретатор» V8 внутренне компилируется в собственный код, Rhino дополнительно компилируется внутри байт-кода Java, а различные интерпретаторы Mozilla ({Trace, Spider, Jager} Monkey) используют JIT-компилятор.
V8 :
V8 повышает производительность, компилируя JavaScript в машинный код перед его выполнением, вместо выполнения байт-кода или его интерпретации.
Rhino :
public final void setOptimizationLevel(int optimizationLevel)
Установите текущий уровень оптимизации. Ожидается, что уровень оптимизации будет целым числом от -1 до 9. Любые отрицательные значения будут интерпретироваться как -1, а любые значения, превышающие 9, будут интерпретироваться как 9. Уровень оптимизации -1 означает, что режим интерпретации всегда будет используемый. Уровни от 0 до 9 указывают, что файлы классов могут быть сгенерированы. Более высокие уровни оптимизации компенсируют производительность во время компиляции для производительности во время выполнения. Уровень оптимизатора не может быть установлен больше -1, если пакет оптимизатора не существует во время выполнения.
TraceMonkey :
TraceMonkey добавляет компиляцию нативного кода в движок Mozilla JavaScript® (известный как «SpiderMonkey»). Он основан на методике, разработанной в Калифорнийском университете в Ирвине, называемой «трассировка деревьев», и основывается на коде и идеях, которыми поделились с проектом Tamarin Tracing. Конечным результатом является значительное увеличение скорости как в браузере Chrome, так и в контенте веб-страниц.