Interpretato vs Compilato: un'utile distinzione?

28

Qui vengono poste molte domande sugli strumenti linguistici interpretati e compilati. Mi chiedo se la distinzione abbia davvero senso. (In realtà le domande riguardano solitamente le lingue, ma stanno davvero pensando alle implementazioni più popolari di quelle lingue).

Oggi quasi nessuna implementazione è strettamente interpretata. praticamente nessuno analizza ed esegue il codice una riga alla volta. Inoltre, anche l'implementazione che compila il codice macchina sta diventando meno comune. Sempre più spesso, i compilatori prendono di mira una sorta di macchina virtuale.

In effetti, la maggior parte delle implementazioni convergono sulla stessa strategia di base. Il compilatore produce bytecode che viene interpretato o compilato in codice nativo tramite un JIT. È davvero un mix di idee tradizionali di compilazione e interpretazione.

Quindi chiedo: esiste un'utile distinzione tra implementazioni interpretate e implementazione compilata in questi giorni?

    
posta Winston Ewert 26.02.2012 - 19:53
fonte

5 risposte

23

È importante ricordare che l'interpretazione e la compilazione non sono solo alternative l'una all'altra. Alla fine, qualsiasi programma che scrivi (incluso uno compilato per codice macchina) viene interpretato. Interpretare il codice significa semplicemente prendere una serie di istruzioni e restituire una risposta.

Compilare, d'altra parte, significa convertire un programma in una lingua in un'altra lingua. Di solito si presume che durante la compilazione, il codice sia compilato in una lingua "di livello inferiore" (ad esempio codice macchina, qualche tipo di codice byte VM, ecc.). Questo codice compilato è ancora interpretato in seguito.

Per quanto riguarda la tua domanda sull'esistenza di un'utile distinzione tra i linguaggi interpretati e compilati, la mia opinione personale è che tutti dovrebbero avere una comprensione di base di ciò che sta accadendo al codice che scrivono durante l'interpretazione. Quindi, se il loro codice viene compilato JIT, o bytecode-cache, ecc., Il programmatore dovrebbe avere almeno una comprensione di base di cosa significa.

    
risposta data 26.02.2012 - 20:33
fonte
7

La distinzione è profondamente significativa perché i linguaggi compilati limitano la semantica in modi che le lingue interpretate non necessariamente. Alcune tecniche interpretative sono molto difficili (praticamente impossibili) da compilare.

Il codice interpretato può fare cose come generare codice in fase di esecuzione e dare visibilità a quel codice in collegamenti lessicali di un ambito esistente. Questo è un esempio. Un altro è che gli interpreti possono essere estesi con un codice interpretato che può controllare come viene valutato il codice. Questa è la base dell'antico Lisp "fexprs": funzioni chiamate con argomenti non valutati e che decidono cosa fare con loro (avendo pieno accesso all'ambiente necessario per percorrere il codice e valutare le variabili, ecc.). Nei linguaggi compilati, non puoi veramente usare quella tecnica; utilizzate invece le macro: funzioni chiamate in fase di compilazione con argomenti non valutati e traduzione del codice anziché di interpretazione.

Alcune implementazioni linguistiche sono basate su queste tecniche; i loro autori rifiutano la compilazione come un obiettivo importante, e piuttosto abbracciano questo tipo di flessibilità.

L'interpretazione sarà sempre utile come tecnica per l'avvio di un compilatore. Per un esempio concreto, guarda CLISP (un'implementazione popolare di Common Lisp). CLISP ha un compilatore scritto in sé. Quando si crea CLISP, il compilatore viene interpretato durante le prime fasi di costruzione. Viene usato per compilare se stesso, e quindi una volta compilato, la compilazione viene quindi eseguita usando il compilatore compilato.

Senza un kernel di interprete, avresti bisogno di eseguire il bootstrap con alcuni Lisp esistenti, come fa SBCL.

Con l'interpretazione, puoi sviluppare una lingua da zero assoluto, iniziando con il linguaggio assembly. Sviluppa l'I / O di base e le core routine, quindi scrivi un eval, linguaggio macchina ancora. Una volta che hai valutato, scrivi nel linguaggio di alto livello; il kernel del codice macchina esegue la valutazione. Utilizzare questa funzione per estendere la libreria con molte altre routine e scrivere anche un compilatore. Usa il compilatore per compilare quelle routine e il compilatore stesso.

Interpretazione: un importante trampolino di lancio nel percorso che porta alla compilazione!

    
risposta data 05.03.2012 - 07:17
fonte
1

In realtà molte implementazioni di linguaggi sono ancora interpretate in modo restrittivo, potresti non essere a conoscenza di esse. Per citarne alcuni: i linguaggi shell UNIX, le shell Windows cmd e PowerScript, Perl, awk, sed, MATLAB, Mathematica e così via.

    
risposta data 26.02.2012 - 20:04
fonte
1

Penso: Assolutamente sì .

In fact, most implementation are converging on the same basic strategy

In realtà, il C ++ mira a portare nel dominio del compilatore un concetto di alto livello che di solito è consegnato agli interpreti, ma rimane dalla parte delle minoranze ...

    
risposta data 26.02.2012 - 21:01
fonte
-1

Distinzione utile: i programmi interpretati possono modificarsi aggiungendo o modificando funzioni in fase di esecuzione.

    
risposta data 26.02.2012 - 20:06
fonte

Leggi altre domande sui tag