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!