Czy mam zatem przyjąć, że interpretowana część jest wymogiem w specyfikacji języka, czy też mylące jest twierdzenie, że język jest interpretowanym językiem programowania, jeśli chodzi o różnicę między językiem a jego wieloma implementacjami?
Maniacy języka EcmaScript często używają terminu „tłumacz ES” w odniesieniu do implementacji EcmaScript, ale specyfikacja nie używa tego terminu. Przegląd język w szczególności opisuje język w kategoriach tłumacza-agnostyk:
ECMAScript jest oparty na obiektach: podstawowe funkcje języka i hosta są zapewniane przez obiekty, a program ECMAScript to klaster komunikujących się obiektów.
Tak więc EcmaScript zakłada „środowisko hosta”, które jest zdefiniowane jako dostawca definicji obiektów, w tym wszystkie te, które zezwalają na operacje we / wy lub jakiekolwiek inne łącza do świata zewnętrznego, ale nie wymagają interpretera.
Semantyka instrukcji i wyrażeń w języku jest zdefiniowana w kategoriach specyfikacji uzupełniania, które są trywialnie zaimplementowane w interpreterie, ale specyfikacja tego nie wymaga.
8.9 Typ specyfikacji ukończenia
Rodzaj budowy służy do wyjaśnienia zachowania sprawozdania ( break
, continue
, return
i throw
), które wykonują nielokalnych transfery kontroli. Wartości typu Completion to trzykrotki formy ( typ , wartość , cel ), gdzie typ jest jednym z normalnych , break , kontynuuj , zwróć lub wyrzuć , wartość jest dowolną wartością języka ECMAScript lub pustą , a celem jest dowolny identyfikator ECMAScript lub pusty .
Termin „nagłe ukończenie” odnosi się do każdego uzupełnienia innego rodzaju niż normalny .
Nielokalne przekazywanie kontroli można przekształcić w tablice instrukcji ze skokami pozwalającymi na kompilację kodu natywnego lub bajtowego.
„EcmaScript Engine” może być lepszym sposobem wyrażenia tego samego pomysłu.
Najwyraźniej nie ma statycznych kompilatorów dla JavaScript
To nie jest prawda. „Interpreter” V8 kompiluje wewnętrznie kod macierzysty, Rhino opcjonalnie kompiluje wewnętrznie kod bajtowy Java, a różne interpretery Mozilli ({Trace, Spider, Jager} Monkey) używają kompilatora JIT.
V8 :
Wersja 8 zwiększa wydajność, kompilując JavaScript do natywnego kodu maszynowego przed jego uruchomieniem, w porównaniu do wykonania kodu bajtowego lub jego interpretacji.
Nosorożec :
public final void setOptimizationLevel(int optimizationLevel)
Ustaw bieżący poziom optymalizacji. Oczekuje się, że poziom optymalizacji będzie liczbą całkowitą od -1 do 9. Wszelkie wartości ujemne będą interpretowane jako -1, a wszelkie wartości większe niż 9 będą interpretowane jako 9. Poziom optymalizacji -1 wskazuje, że tryb interpretacji zawsze będzie używany. Poziomy od 0 do 9 wskazują, że można wygenerować pliki klas. Wyższe poziomy optymalizacji zmniejszają wydajność czasu kompilacji dla wydajności środowiska wykonawczego. Poziomu optymalizatora nie można ustawić na wartość wyższą niż -1, jeśli pakiet optymalizatora nie istnieje w czasie wykonywania.
TraceMonkey :
TraceMonkey dodaje kompilację kodu natywnego do silnika JavaScript® Mozilli (znanego jako „SpiderMonkey”). Opiera się na technice opracowanej w UC Irvine o nazwie „drzewa śledzące” oraz w oparciu o kod i idee wspólne dla projektu Tamarin Tracing. Wynik netto to ogromny wzrost prędkości zarówno w przeglądarce Chrome, jak i zawartości strony internetowej.