2011-08-31 8 views
5

Jestem dopuszczonym początkującym programistą JavaScript i staram się dowiedzieć więcej. Zwracam się więc do was po pomoc, z tym łatwym pytaniem :). Książka O'Reilly, którą czytam, odnosi się do czasu kompilacji kodu JavaScript. Moja znajomość programowania funkcjonalnego (schematu i podobieństw) mówi mi, że JavaScript jest interpretowany przez przeglądarkę, najprawdopodobniej wymagając dwóch przejść przez JavaScript.Czy JavaScript jest kompilowany czy dwu-przebiegowy?

Czy jestem błędny w mojej ocenie? Czy jest to czas kompilacji, który książka odnosi się właściwie tylko do pierwszego przejścia interpretera, podobnego do tego, jak funkcjonowałby Perl lub Python? Dzięki!

+0

Większość dynamicznych implementacji językowych najpierw "analizuje" dane wejściowe w drzewie składni abstrakcyjnych sortów - jest to część, w której wykrywane są błędy składniowe. Następnie AST może być uruchomiony ("chodził") bezpośrednio lub może zostać przekształcony w jakiś wewnętrzny kod bajtowy i/lub JIT. "Sposób" uruchomienia nie jest określony w specyfikacji ECMAScript i znacznie się różni w zależności od różnych implementacji. –

Odpowiedz

11

Jest zależny od przeglądarki. Sprawdź WebKit's SquirrelFish Extreme i Google V8, aby zobaczyć, co jest na najszybszym końcu, i spójrz na JaegerMonkey Mozilli dla tej implementacji.

AFIAK V8 i SFX to JIT, więc kompilują kod JS do natywnego. JaegerMonkey i TraceMonkey łączą się w Firefoksie, tworząc system, w którym gdyby kod był szybciej śledzony, TraceMonkey go wykonuje, a jeśli kod był szybszy natywny, JaegerMonkey je kompiluje, tak jak SFX.

+0

Rzeczywiście +1, Nie ma mandatu * jak * ECMAScript jest uruchamiany, z wyjątkiem tego, że ma semantykę opisaną w [Specyfikacji języka ECMAScript] (http://www.ecma-international.org/publications/standards/Ecma -262.htm). –

+0

Czy możesz prekompilować javascript i wysłać go do przeglądarki w zależności od otrzymanego klienta? – Ced

0

Czy masz zdanie, które możesz zacytować, aby pomóc w kontekście?

Javascript jest kompilowany w przeglądarce (jest wysyłany do przeglądarki w prostym źródle). Ale zostanie skompilowany tylko po załadowaniu. Więc jeśli masz tag skryptu, po którym następuje tag div, a następnie tag skryptu, to załaduje on te rzeczy sekwencyjnie. Przeglądarka przestanie ładować całą stronę (nadal pobiera zasoby, po prostu nie ładuje HTML) dopóki twój skrypt nie zostanie załadowany (dzieje się tak, ponieważ skrypt może zawierać w sobie "document.write").

<script> 
var someVariable = 'hello world'; 
alert(document.getElementById('someid')); //alerts undefined 
</script> 

<div id='someid'></div> 

<script> 
alert(document.getElementById('someid')); //alerts 'someid' 
alert(someVariable); //alerts 'hello world' 
</script> 
0

Jest czas odczytu i run-time w JS (jak lubię myśleć o tym, ponieważ to nie jest naprawdę skompilowany, ale interpretowane). Wygląda na to, że książka O'Reilly używa czasu kompilacji jako synonimu czasu czytania.

Czas odczytu to moment, w którym silnik odczytuje cały kod i ocenia wszystko w zakresie globalnym. Zwykle ustawia haki na zdarzenia, które spowodują uruchomienie kodu.

Run-time to wszystko.

Powiązane problemy