Interprete (informatica)

Da Wikipedia, l'enciclopedia libera.
Vai a: navigazione, cerca

In informatica e programmazione, un interprete è un programma in grado di eseguire altri programmi a partire direttamente dal relativo codice sorgente.

Indice

[modifica] Aspetti generali

Un interprete ha lo scopo di eseguire un programma in un linguaggio di alto livello, senza la previa compilazione dello stesso. Esso, infatti, ha il compito di eseguire le istruzioni nel linguaggio usato, traducendole di volta in volta in istruzioni in linguaggio macchina.

[modifica] Linguaggi interpretati

I linguaggi che prevedono l'esecuzione dei listati di codice per mezzo di un interprete sono detti linguaggi interpretati. Il loro approccio si differenzia perciò da quello dei linguaggi compilati: 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). In linea di principio, per qualunque linguaggio di programmazione si potrebbe scrivere sia un interprete che un compilatore; pertanto c'è chi sostiene che espressioni come linguaggio interpretato o linguaggio compilato siano scorrette, essendo interpretazione e compilazione concetti afferenti alla implementazione di un linguaggio e non al linguaggio in sé. Nella pratica, tuttavia, un linguaggio viene solitamente progettato o per essere compilato o per essere interpretato, in quanto questa scelta è fortemente legata ai requisiti sulla base dei quali il linguaggio stesso viene creato. Così, per esempio, un interprete per il linguaggio C è abbastanza raro rispetto a un compilatore, essendo la velocità di esecuzione fra le principali sue ragioni d'essere; allo stesso modo, molti linguaggi sono specificamente progettati per essere interpretati: tra questi ci sono il Python, il Basic, il Perl, il PHP e numerosi altri, tra cui quelli per lo scripting di shell (come Bash).

[modifica] Script engine

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 alto livello di astrazione.

[modifica] 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 istruzioni a partire dal livello sintattico, identificare le azioni da eseguire (eventualmente trasformando i nomi simbolici delle variabili coinvolte nei corrispondenti 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.

[modifica] Approcci ibridi

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 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, 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 portabile).

Una tecnica che ha destato notevole interesse negli ultimi anni (ed è applicata dalla maggior parte delle attuali implementazioni di Java e dai linguaggi della famiglia DOTNET di Microsoft) prende il nome di compilazione "just in time" o JIT. Questa tecnica può essere considerata come una 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.

[modifica] Voci correlate

informatica Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica
Strumenti personali
Namespace

Varianti
Azioni
Navigazione
Comunità
Stampa/esporta
Strumenti
Altre lingue