JavaScript interpretato o compilato?

I computer non possono effettivamente eseguire il codice che scrivi in ​​JavaScript (o in qualsiasi altra lingua per quella materia). I computer possono eseguire solo codice macchina. Il codice macchina che può essere eseguito da un determinato computer è definito all'interno del processore che eseguirà tali comandi e può essere diverso per processori diversi.

Ovviamente, scrivere codice macchina era difficile da fare per le persone (è 125 un comando add o è 126 o forse 27). Per ovviare a questo problema sono stati creati quelli che sono noti come linguaggi assembly. Queste lingue usavano nomi più ovvi per i comandi (come ADD per l'aggiunta) e quindi eliminavano la necessità di ricordare i codici macchina esatti. I linguaggi di assemblaggio hanno ancora una relazione uno a uno con il particolare processore e codice macchina in cui il computer converte quei comandi.

Le lingue dell'assembly devono essere compilate o interpretate

Molto presto si è capito che erano necessarie lingue più facili da scrivere e che il computer stesso poteva essere utilizzato per tradurre quelle nelle istruzioni del codice macchina che il computer può effettivamente comprendere. Ci sono stati due approcci che potevano essere adottati con questa traduzione ed entrambe le alternative sono state scelte (l'una o l'altra saranno usate a seconda della lingua utilizzata e dove viene eseguita).

Una lingua compilata è quella in cui una volta che il programma è stato scritto, si alimenta il codice attraverso un programma chiamato compilatore e che produce una versione in codice macchina del programma. Quando si desidera eseguire il programma, è sufficiente chiamare la versione del codice macchina. Se si apportano modifiche al programma, è necessario ricompilarlo prima di poter testare il codice modificato.

Un linguaggio interpretato è un linguaggio in cui le istruzioni vengono convertite da ciò che è stato scritto nel codice macchina durante l'esecuzione del programma. Un linguaggio interpretato ottiene sostanzialmente un'istruzione dalla sorgente del programma, la converte in codice macchina, esegue quel codice macchina e quindi prende l'istruzione successiva dalla fonte per ripetere il processo.

Due varianti sulla compilazione e l'interpretazione

Una variante utilizza un processo in due fasi. Con questa variante, l'origine del programma non viene compilata direttamente nel codice macchina, ma viene invece convertita in un linguaggio simile ad un assembly che è ancora indipendente dal particolare processore. Quando si desidera eseguire il codice, questo elabora quindi il codice compilato tramite un interprete specifico del processore in modo da ottenere il codice macchina appropriato per quel processore. Questo approccio ha molti dei vantaggi della compilazione mantenendo l'indipendenza del processore poiché lo stesso codice compilato può essere interpretato da molti processori diversi. Java è una lingua che utilizza spesso questa variante.

L'altra variante è chiamata compilatore Just in Time (o JIT). Con questo approccio, non si esegue effettivamente il compilatore dopo aver scritto il codice. Invece, ciò accade automaticamente quando si esegue il codice. Usando un compilatore Just in Time il codice non viene interpretato istruzione per istruzione, viene compilato tutto in una volta ogni volta che viene chiamato per essere eseguito e quindi viene eseguita la versione compilata che ha appena creato. Questo approccio assomiglia molto al codice che viene interpretato, tranne per il fatto che invece di trovare errori solo quando viene raggiunta l'istruzione con l'errore, gli eventuali errori rilevati dal compilatore comportano l'esecuzione del codice al posto di tutto il codice fino a quel momento in esecuzione. PHP è un esempio di un linguaggio che di solito utilizza compilation just in time.

JavaScript è compilato o interpretato?

Quindi ora sappiamo cosa significano il codice interpretato e il codice compilato, la domanda a cui dovremo successivamente rispondere è che cosa ha a che fare tutto ciò con JavaScript? A seconda di dove esattamente si esegue JavaScript, il codice può essere compilato o interpretato o utilizzare una delle altre due varianti menzionate. Il più delle volte si esegue JavaScript in un browser Web e lì viene generalmente interpretato JavaScript.

Le lingue interpretate sono generalmente più lente delle lingue compilate. Ci sono due ragioni per questo. In primo luogo, il codice da interpretare deve essere interpretato prima di poter essere eseguito e, in secondo luogo, ciò deve accadere ogni volta che deve essere eseguita l'istruzione (non solo ogni volta che si esegue JavaScript, ma se è in un ciclo, allora deve essere fatto ogni volta intorno al ciclo). Ciò significa che il codice scritto in JavaScript funzionerà più lentamente del codice scritto in molte altre lingue.

In che modo questo ci aiuta a capire dove JavaScript è l'unica lingua disponibile per noi su tutti i browser Web? L'interprete JavaScript stesso incorporato nel browser Web non è scritto in JavaScript. Invece, è scritto in un'altra lingua che è stata quindi compilata. Ciò significa che puoi rendere il tuo JavaScript più veloce se puoi sfruttare tutti i comandi forniti da JavaScript che ti consentono di scaricare l'attività sul motore JavaScript stesso.

Esempi per ottenere JavaScript per l'esecuzione più veloce

Un esempio di ciò è che alcuni ma non tutti i browser hanno implementato un metodo document.getElementsByClassName () all'interno del motore JavaScript mentre altri devono ancora farlo. Quando abbiamo bisogno di questa particolare funzionalità, possiamo far funzionare il codice più velocemente in quei browser in cui il motore JavaScript lo fornisce utilizzando il rilevamento delle funzionalità per vedere se il metodo esiste già e creare la nostra versione di quel codice in JavaScript solo quando il motore JavaScript non lo fa ' te lo forniamo. Laddove il motore JavaScript fornisca tale funzionalità, dovrebbe essere eseguito più rapidamente se lo utilizziamo anziché eseguire la nostra versione scritta in JavaScript. Lo stesso vale per qualsiasi elaborazione che il motore JavaScript mette a nostra disposizione per essere chiamato direttamente.

Ci saranno anche casi in cui JavaScript fornisce diversi modi per fare la stessa richiesta. In questi casi, uno dei modi per accedere alle informazioni può essere più specifico dell'altro. Ad esempio document.getElementsByTagName ('table') [0] .tBodies e document.getElementsByTagName ('table') [0] .getElementsByTagName ('tbody') recuperano entrambi lo stesso nodelist dei tag tbody nella prima tabella nel web pagina tuttavia il primo di questi è un comando specifico per recuperare i tag tbody in cui il secondo identifica che stiamo recuperando i tag tbody in un parametro e altri valori possono essere sostituiti per recuperare altri tag. Nella maggior parte dei browser, la variante più breve e più specifica del codice verrà eseguita più velocemente (in alcuni casi molto più velocemente) rispetto alla seconda variante e quindi ha senso utilizzare la versione più breve e specifica. Inoltre semplifica la lettura e la manutenzione del codice.

Ora in molti di questi casi, la differenza effettiva nel tempo di elaborazione sarà molto piccola e sarà solo quando si sommano molte di queste scelte di codice che si otterrà una notevole differenza nel tempo necessario per l'esecuzione del codice. È abbastanza raro però che cambiare il codice per renderlo più veloce renderà il codice significativamente più lungo o più difficile da mantenere, e spesso sarà vero il contrario. Vi è anche il vantaggio aggiuntivo che potrebbero essere create le versioni future dei motori JavaScript che accelera ulteriormente la variante più specifica in modo che l'utilizzo della variante specifica possa significare che il codice verrà eseguito più velocemente in futuro senza che tu debba modificare nulla.