Interprete (informatica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
Nessun oggetto della modifica
Annullata la modifica 142969260 di 93.34.31.196 (discussione)
Etichette: Annulla Modifica da mobile Modifica da web per mobile Modifica da mobile avanzata
 
(31 versioni intermedie di 23 utenti non mostrate)
Riga 1:
{{F|programmazione|ottobre 2012}}
Un '''interprete''', in [[informatica]] e nella [[Programmazione (informatica)|programmazione]], è un [[programma (informatica)|programma]] in grado di [[esecuzione (informatica)|eseguire]] altri programmi a partire direttamente dal relativo [[codice sorgente]] scritto in un [[linguaggio di programmazione ad alto livello|linguaggio di alto livello]], senza la previa [[compilazione]] dello stesso ([[codice oggetto]]), eseguendo cioè le [[istruzione (informatica)|istruzioni]] nel linguaggio usato traducendole di volta in volta in istruzioni in [[linguaggio macchina]] del [[processore]].
 
== Descrizione ==
Ha lo scopo di eseguire un programma in un [[linguaggio di programmazione ad alto livello|linguaggio di alto livello]], senza la previa [[compilazione]] dello stesso ([[codice oggetto]]) cioè di eseguire le [[istruzione (informatica)|istruzioni]] nel linguaggio usato, traducendole di volta in volta in istruzioni in [[linguaggio macchina]].
A differenza di un interprete, un [[compilatore]] non ''esegue'' il programma che riceve in ingresso, ma lo traduce in [[linguaggio macchina]] (memorizzando su [[file]] il [[codice oggetto]] pronto per l'esecuzione diretta da parte del [[processore]]). Per qualunque [[linguaggio di programmazione]] si può scrivere sia un interprete che un compilatore, pertanto le espressioni ''linguaggio interpretato'' e ''linguaggio compilato'', per quanto comuni, sono scorretteimproprie, essendo interpretazione e compilazione concetti afferenti alla [[implementare|implementazione]] di un linguaggio e non al linguaggio in sé.
 
=== Script engine ===
== Caratteristiche ==
Lo "scripting engine" è un motore che interpreta liste di comandi, dette [[script]], formulati con una sintassi determinata, detta [[linguaggio di scripting]]. Solitamente troviamo uno ''scripting engine'' dove si ha la necessità di fornire una grande flessibilità per aspetti specifici, senza eccessive esigenze di velocità. La semplicità e l'immediatezza sono quindi requisiti fondamentali. Ciò colloca gli ''scripting engine'' ad un [[Linguaggio di programmazione ad alto livello|alto livello di astrazione]].
A differenza di un interprete, un [[compilatore]] non ''esegue'' il programma che riceve in ingresso, ma lo traduce in [[linguaggio macchina]] (memorizzando su [[file]] il [[codice oggetto]] pronto per l'esecuzione diretta da parte del [[processore]]).
 
=== Pro e contro ===
Per qualunque [[linguaggio di programmazione]] si può scrivere sia un interprete che un compilatore, pertanto le espressioni ''linguaggio interpretato'' e ''linguaggio compilato'' sono scorrette, essendo interpretazione e compilazione concetti afferenti alla [[implementare|implementazione]] di un linguaggio e non al linguaggio in sé.
L'approccio interpretato comporta una minore efficienza a [[run-time]]; un programma interpretato, in esecuzione, richiede più memoria ed è meno veloce, a causa dell'[[overhead]] introdotto dall'interprete stesso. Durante l'esecuzione, l'interprete deve infatti analizzare le [[istruzioneIstruzione (informatica)|istruzioni]] a partire dal livello [[sintassi|sintattico]], identificare le ''azioni'' da eseguire (eventualmente trasformando i [[nome simbolico|nomi simbolici]] delle [[variabile (informatica)|variabili]] coinvolte nei corrispondenti [[indirizzo di memoria|indirizzi di memoria]]), ed eseguirle; mentre le istruzioni del codice compilato, già in linguaggio macchina, vengono caricate e istantaneamente eseguite dal [[processore]].
 
In compenso, l'interpretazione di un programma può essere più rapida del ciclo compilazione/esecuzione. Questa differenza può costituire un vantaggio durante lo sviluppo, specialmente se questo viene condotto con tecniche di [[fast prototyping]], o durante il [[debugging]]. Inoltre, la maggior parte degli interpreti consentono all'utente di agire sul programma in esecuzione sospendendolo, ispezionando o modificando i contenuti delle sue variabili, e così via, in modo spesso più flessibile e potente di quanto si possa ottenere, per il codice compilato, da un [[debugger]].
==Script engine==
Lo "scripting engine" è un motore che interpreta liste di comandi, dette [[script]], formulati con una sintassi determinata, detta [[linguaggio di scripting]].
 
=== Approcci ibridi ===
Solitamente troviamo uno ''scripting engine'' dove si ha la necessità di fornire una grande flessibilità per aspetti specifici, senza eccessive esigenze di velocità. La semplicità e l'immediatezza sono quindi requisiti fondamentali. Ciò colloca gli ''scripting engine'' ad un [[Linguaggio di programmazione ad alto livello|alto livello di astrazione]].
Esistono invece numerosi approcci ''ibridi'' fra linguaggi completamente interpretati e completamente compilati. Alcune versioni di [[Lisp]] consentono entrambi gli approcci, e consentono addirittura l'esecuzione di programmi parzialmente interpretati e parzialmente compilati, cosicché, per esempio, un nuovo [[subroutine|sottoprogramma]] possa essere provato in forma interpretata e, una volta terminato il [[debugging]], essere compilato per migliorarne le prestazioni. Molti interpreti non eseguono direttamente il codice sorgente, ma lo convertono preventivamente in una forma interna più compatta, per esempio in un [[albero sintattico astratto]]. Ancora diverso è l'approccio di [[Emacs Lisp]] e [[Java (linguaggio)|Java]], in cui viene impiegato un compilatore che trasforma il [[codice sorgente]] in un formato intermedio detto (per entrambi i linguaggi !) [[bytecode]], abbastanza vicino al [[linguaggio macchina]] (e quindi con un costo di interpretazione moderato), ma eseguito da un interprete e non direttamente dal processore (e quindi [[portabilità|portabile]]).
 
Molti interpreti non eseguono direttamente il codice sorgente, ma lo convertono preventivamente in una forma interna più compatta, per esempio in un [[albero sintattico astratto]]. Ancora diverso è l'approccio di [[Emacs Lisp]] e [[Java (linguaggio di programmazione)|Java]], in cui viene impiegato un compilatore che trasforma il [[codice sorgente]] in un formato intermedio detto (per entrambi i linguaggi) [[bytecode]], abbastanza vicino al [[linguaggio macchina]] (e quindi con un costo di interpretazione moderato), ma eseguito da un interprete e non direttamente dal processore (e quindi [[portabilità|portabile]]).
==Pro e contro==
L'approccio interpretato comporta una minore efficienza a [[run-time]]; un programma interpretato, in esecuzione, richiede più memoria ed è meno veloce, a causa dell'[[overhead]] introdotto dall'interprete stesso. Durante l'esecuzione, l'interprete deve infatti analizzare le [[istruzione|istruzioni]] a partire dal livello [[sintassi|sintattico]], identificare le ''azioni'' da eseguire (eventualmente trasformando i [[nome simbolico|nomi simbolici]] delle [[variabile (informatica)|variabili]] coinvolte nei corrispondenti [[indirizzo di memoria|indirizzi di memoria]]), ed eseguirle; mentre le istruzioni del codice compilato, già in linguaggio macchina, vengono caricate e istantaneamente eseguite dal [[processore]].
 
Una tecnica che ha destato notevole interesse negli ultimi anni (ed è applicata dalla maggior parte delle attuali implementazioni di [[Java (linguaggio di programmazione)|Java]] e dai linguaggi della famiglia [[Microsoft .Net|DOTNET.NET]] di Microsoft) prende il nome di [[Compilatore just-in-time|compilazione "just in time"]] o JIT. Questa tecnica può essere considerata come una [[ottimizzazione (informatica)|ottimizzazione]] dell'interpretazione, in cui l'interprete compila durante l'esecuzione i frammenti di codice che vengono eseguiti con maggiore frequenza, per ridurre il costo delle loro successive esecuzioni.
In compenso, l'interpretazione di un programma può essere più rapida del ciclo compilazione/esecuzione. Questa differenza può costituire un vantaggio durante lo sviluppo, specialmente se questo viene condotto con tecniche di [[fast prototyping]], o durante il [[debugging]]. Inoltre, la maggior parte degli interpreti consentono all'utente di agire sul programma in esecuzione sospendendolo, ispezionando o modificando i contenuti delle sue variabili, e così via, in modo spesso più flessibile e potente di quanto si possa ottenere, per il codice compilato, da un [[debugger]].
 
==ApprocciVoci ibridicorrelate==
* [[Compilazione|Compilatore]]
Esistono invece numerosi approcci ''ibridi'' fra linguaggi completamente interpretati e completamente compilati. Alcune versioni di [[Lisp]] consentono entrambi gli approcci, e consentono addirittura l'esecuzione di programmi parzialmente interpretati e parzialmente compilati, cosicché, per esempio, un nuovo [[subroutine|sottoprogramma]] possa essere provato in forma interpretata e, una volta terminato il [[debugging]], essere compilato per migliorarne le prestazioni. Molti interpreti non eseguono direttamente il codice sorgente, ma lo convertono preventivamente in una forma interna più compatta, per esempio in un [[albero sintattico astratto]]. Ancora diverso è l'approccio di [[Emacs Lisp]] e [[Java (linguaggio)|Java]], in cui viene impiegato un compilatore che trasforma il [[codice sorgente]] in un formato intermedio detto (per entrambi i linguaggi !) [[bytecode]], abbastanza vicino al [[linguaggio macchina]] (e quindi con un costo di interpretazione moderato), ma eseguito da un interprete e non direttamente dal processore (e quindi [[portabilità|portabile]]).
* [[Linguaggio di programmazione]]
* [[One-liner]]
* [[Programmazione (informatica)]]
 
== Altri progetti ==
Una tecnica che ha destato notevole interesse negli ultimi anni (ed è applicata dalla maggior parte delle attuali implementazioni di [[Java (linguaggio)|Java]] e dai linguaggi della famiglia [[Microsoft .Net|DOTNET]] di Microsoft) prende il nome di [[Compilatore just-in-time|compilazione "just in time"]] o JIT. Questa tecnica può essere considerata come una [[ottimizzazione (informatica)|ottimizzazione]] dell'interpretazione, in cui l'interprete compila durante l'esecuzione i frammenti di codice che vengono eseguiti con maggiore frequenza, per ridurre il costo delle loro successive esecuzioni.
{{Interprogetto|wikt=interprete|preposizione=sull'}}
 
== Collegamenti esterni ==
==Voci correlate==
* {{Collegamenti esterni}}
*[[Compilazione]]
* {{FOLDOC|interpreter|interpreter}}
*[[Linguaggio di programmazione]]
* {{Garzanti}}
*[[One-liner]]
 
{{Controllo di autorità}}
{{Portale|informatica}}
 
[[Categoria:Interpreti| ]]
[[Categoria:Teorie della programmazione]]