La distinzione è profondamente significativa perché le lingue compilate 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 associazioni 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 per gli antichi "fexprs" di Lisp: funzioni che vengono chiamate con argomenti non valutati e decidono cosa farne (avere pieno accesso all'ambiente necessario per percorrere il codice e valutare le variabili, ecc.). Nei linguaggi compilati, non puoi davvero usare quella tecnica; usi invece le macro: funzioni che vengono chiamate in fase di compilazione con argomenti non valutati e traducono il codice anziché interpretarlo.
Alcune implementazioni del linguaggio sono costruite attorno a queste tecniche; i loro autori rifiutano la compilazione come un obiettivo importante e preferiscono abbracciare questo tipo di flessibilità.
L'interpretazione sarà sempre utile come tecnica per avviare un compilatore. Per un esempio concreto, guarda CLISP (un'implementazione popolare di Common Lisp). CLISP ha un compilatore che è scritto in sé. Quando si crea CLISP, quel compilatore viene interpretato durante le prime fasi di costruzione. Viene utilizzato per compilare se stesso, quindi una volta compilato, la compilazione viene quindi eseguita utilizzando il compilatore compilato.
Senza un kernel interprete, avresti bisogno di avviare bootstrap con alcuni Lisp esistenti, come fa SBCL.
Con l'interpretazione, è possibile sviluppare un linguaggio da zero, iniziando con il linguaggio assembly. Sviluppa l'I / O di base e le routine di base, quindi scrivi un linguaggio di valutazione ancora fermo. Una volta che hai valutato, scrivi nella lingua di alto livello; il kernel del codice macchina esegue la valutazione. Utilizzare questa funzione per estendere la libreria con molte più routine e scrivere anche un compilatore. Utilizzare il compilatore per compilare quelle routine e il compilatore stesso.
Interpretazione: un importante trampolino di lancio nel percorso che porta alla compilazione!