Linguaggio interpretato - Interpreted language

Un linguaggio interpretato è un tipo di linguaggio di programmazione per il quale esiste un interprete che gira su una macchina virtuale. L'interprete esegue il codice riga per riga e lo converte in linguaggio macchina di basso livello. Poiché il linguaggio interpretato funziona su un ambiente virtuale, queste lingue sono considerate indipendenti dalla piattaforma.

I termini linguaggio interpretato e linguaggio compilato non sono ben definiti perché, in teoria, qualsiasi linguaggio di programmazione può essere interpretato o compilato. Nell'implementazione del linguaggio di programmazione moderno, è sempre più popolare per una piattaforma fornire entrambe le opzioni.

I linguaggi interpretati possono anche essere messi a confronto con i linguaggi macchina. Funzionalmente, sia l'esecuzione che l'interpretazione significano la stessa cosa: recuperare l'istruzione / istruzione successiva dal programma ed eseguirla. Sebbene il byte code interpretato sia inoltre identico al codice macchina nella forma e abbia una rappresentazione assembler , il termine "interpretato" è talvolta riservato ai linguaggi "elaborati dal software" (dalla macchina virtuale o dall'emulatore ) sopra il processore nativo (cioè hardware ).

In linea di principio, i programmi in molte lingue possono essere compilati o interpretati, emulati o eseguiti in modo nativo, quindi questa designazione viene applicata esclusivamente in base alla pratica di implementazione comune, piuttosto che rappresentare una proprietà essenziale di un linguaggio.

Molti linguaggi sono stati implementati utilizzando sia compilatori che interpreti, inclusi BASIC , C , Lisp e Pascal . Java e C # sono compilati in bytecode , il linguaggio interpretato adatto alle macchine virtuali . Le implementazioni Lisp possono combinare liberamente codice interpretato e compilato.

La distinzione tra un compilatore e un interprete non è sempre ben definita e molti processori di linguaggio fanno una combinazione di entrambi.

Sfondo storico

Agli albori dell'informatica, la progettazione del linguaggio era fortemente influenzata dalla decisione di utilizzare la compilazione o l'interpretazione come modalità di esecuzione. Ad esempio, Smalltalk (1980), progettato per essere interpretato in fase di esecuzione, consente agli oggetti generici di interagire dinamicamente tra loro.

Inizialmente, i linguaggi interpretati venivano compilati riga per riga; cioè, ogni riga è stata compilata mentre stava per essere eseguita, e se un ciclo o una subroutine ha causato l'esecuzione di certe righe più volte, queste sarebbero state ricompilate ogni volta. Questo è diventato molto meno comune. La maggior parte dei cosiddetti linguaggi interpretati utilizza una rappresentazione intermedia , che combina la compilazione e l'interpretazione.

Esempi inclusi:

La rappresentazione intermedia può essere compilata una volta per tutte (come in Java ), ogni volta prima dell'esecuzione (come in Ruby ), o ogni volta che viene rilevato un cambiamento nel sorgente prima dell'esecuzione (come in Python ).

Vantaggi

L'interpretazione di un linguaggio offre alle implementazioni una certa flessibilità aggiuntiva rispetto alle implementazioni compilate. Le caratteristiche che sono spesso più facili da implementare negli interpreti che nei compilatori includono:

Inoltre, il codice sorgente può essere letto e copiato, offrendo agli utenti maggiore libertà.

Svantaggi

Gli svantaggi delle lingue interpretate sono:

  • Senza il controllo del tipo statico , che di solito viene eseguito da un compilatore, i programmi possono essere meno affidabili, perché il controllo del tipo elimina una classe di errori di programmazione (sebbene il controllo del tipo del codice possa essere eseguito utilizzando strumenti autonomi aggiuntivi. Vedere TypeScript per esempio)
  • Gli interpreti possono essere suscettibili agli attacchi di iniezione di codice .
  • Esecuzione più lenta rispetto all'esecuzione diretta del codice macchina nativo sulla CPU host . Una tecnica utilizzata per migliorare le prestazioni è la compilazione just-in-time che converte le sequenze di istruzioni interpretate eseguite di frequente in codice macchina host. JIT è spesso combinato con la compilazione in byte-code come in Java .
  • Il codice sorgente può essere letto e copiato (es. JavaScript nelle pagine web), o più facilmente decodificato attraverso la riflessione in applicazioni in cui la proprietà intellettuale ha un vantaggio commerciale. In alcuni casi, l' offuscamento viene utilizzato come difesa parziale contro questo.

Tornasole

Diversi criteri possono essere utilizzati per determinare se è probabile che una particolare lingua venga chiamata compilata o interpretata dai suoi utenti:

  • Se una subroutine può essere invocata prima di dove è definita nel codice sorgente, è probabile che l'intera sorgente venga compilata in una rappresentazione intermedia prima dell'esecuzione. Esempi: Perl , Java
  • Se una rappresentazione intermedia (es. Bytecode) viene generalmente creata e invocata direttamente come passaggio separato durante l'esecuzione del codice, è probabile che il linguaggio venga considerato compilato. Esempi: Java , C
  • Se un errore di sintassi nel codice sorgente non impedisce l'esecuzione di istruzioni precedenti, è probabile che si tratti di un paradigma interpretato. Esempi: linguaggi della shell Unix

Questi non sono definitivi. I linguaggi compilati possono avere proprietà simili a interpreti e viceversa.

Elenco delle lingue interpretate di uso frequente

Linguaggi solitamente compilati in bytecode

Molte lingue vengono prima compilate in bytecode . A volte, il bytecode può anche essere compilato in un binario nativo utilizzando un compilatore AOT o eseguito in modo nativo, dal processore hardware.

Guarda anche

Citazione

  1. ^ "CodePlex Archive" . Archivio CodePlex . Estratto 7 mese di aprile il 2018 .

Riferimenti

  • Brown, PJ (1979). Scrittura di compilatori e interpreti interattivi . John Wiley. ISBN   0-471-27609-X .