2011-08-31 9 views
5

Sono un programmatore JavaScript principiante ammesso e sto cercando di saperne di più. Quindi mi rivolgo a voi gente per chiedere aiuto, con questa semplice domanda :). Il libro di O'Reilly che sto leggendo continua a riferirsi al tempo di compilazione del codice JavaScript. La mia conoscenza della programmazione funzionale (schema e simili) mi dice che il JavaScript è in realtà interpretato dal browser, molto probabilmente richiede due passaggi attraverso il JavaScript.Compilare Javascript o interpretare due passaggi?

Sono errato nella mia valutazione? O è il tempo di compilazione che il libro fa riferimento in realtà solo al primo passaggio dell'interprete, simile a come avrebbe funzionato Perl o Python? Grazie!

+0

La maggior parte delle implementazioni linguistiche dinamiche analizzeranno innanzitutto l'input in una Tree Sintassi astratta: questa è la parte in cui vengono rilevati gli errori di sintassi. Successivamente, l'AST può essere eseguito direttamente ("camminato") oppure può essere convertito in un qualche tipo di bytecode interno e/o JIT'ed. Il "come" da eseguire non è specificato nella specifica ECMAScript e varia notevolmente tra le diverse implementazioni. –

risposta

11

È dipendente dal browser. Cerca su SquirrelFish Extreme di WebKit e su Google V8 per vedere quale è la parte più veloce delle cose e guarda JaegerMonkey di Mozilla per quella implementazione.

AFIAK V8 e SFX sono JIT, quindi compilano il codice JS in nativo. JaegerMonkey e TraceMonkey si combinano in Firefox per formare un sistema in cui se il codice viene tracciato più rapidamente, TraceMonkey lo esegue, e se il codice fosse più veloce nativo, JaegerMonkey lo compila, proprio come SFX.

+0

In effetti +1, non vi è alcun mandato su * come * viene eseguito ECMAScript, eccetto che ha la semantica descritta nella [Specifica del linguaggio ECMAScript] (http://www.ecma-international.org/publications/standards/Ecma -262.htm). –

+0

potresti precompilare javascript e inviarlo a un browser a seconda dell'agente utente ricevuto? – Ced

0

Hai una frase che potresti citare per aiutare con il contesto?

Javascript è compilato nel browser (è inviato al browser in plain source). Ma viene compilato solo quando viene caricato. Quindi se hai un tag script seguito da un tag div seguito da un tag script allora caricherà queste cose in modo sequenziale. Il browser interromperà il caricamento dell'intera pagina (continua a scaricare risorse, non carica HTML) finché il tuo script non è stato caricato (questo perché lo script potrebbe avere "document.write" al suo interno).

<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

C'è lettura-time e run-time a JS (come mi piace pensare che, dal momento che non è davvero compilato, ma interpretato). Sembra che il libro di O'Reilly stia usando la compilazione come sinonimo di lettura.

La lettura è quando il motore legge tutto il codice e valuta tutto alla portata globale. Di solito questo imposta hook su eventi che attiveranno l'esecuzione del codice.

Il tempo di esecuzione è tutto il resto.

Problemi correlati