Differenza tra linguaggi di programmazione interpretati e linguaggi compilati

I linguaggi di programmazione sono tanti e ne nascono in continuazione di nuovi (di alcuni di essi abbiamo fatto conoscenza in questa rubrica). Ogni linguaggio di programmazione risponde ovviamente ad esigenze di diverso tipo. La distinzione principale che possiamo fare è tra linguaggi interpretati e compilati. Immaginiamo un lavoratore alle dirette dipendenze di un datore di lavoro che parla un’altra lingua e per questo sarà necessario che ci sia un traduttore. Sappiamo già che i vari linguaggi di programmazione sono ben diversi dalla lingua che il computer “comprende” immediatamente, cioè il linguaggio macchina. La metafora del datore di lavoro che non parla la lingua del suo dipendente ci serve per rappresentare non solamente ciò, ma anche la distinzione tra linguaggi interpretati e compilati. Continuando la metafora, infatti, possiamo immaginare che il datore di lavoro possa scegliere tra due strategie di traduzione dalla sua lingua a quella del dipendente:

1) nel primo caso sceglie di avvalersi di un interprete simultaneo che traduce man mano ciò che egli dice;
2) mentre nel secondo caso sceglie di scrivere prima tutto ciò che vuole che il dipendente faccia, poi lo fa tradurre, per infine farlo eseguire.

Il primo caso rappresenta bene i linguaggi interpretati ed il secondo i linguaggi compilati. Per i linguaggi interpretati, infatti, il codice sorgente di un programma viene tradotto passo passo – durante la stessa esecuzione del programma – in comandi di linguaggio macchina, mentre per i linguaggi compilati il codice sorgente di un programma viene prima tradotto per intero in linguaggio macchina. Quest’ultimo potrà in seguito essere eseguito quando si vuole.

Nessuno dei linguaggi di programmazione che abbiamo usato finora in questa rubrica è compilato. Per quanto riguarda il Python è di tipo ibrido: si può comportare come i linguaggi interpretati o come i linguaggi compilati. In quest’ultimo caso la compilazione non produce codice di linguaggio macchina, bensì di un linguaggio intermedio, denominato bytecode, così come avviene per il linguaggio Java. I linguaggi che compilano in bytecode vengono chiamati pseudocompilati, perché, appunto, non generano direttamente codice eseguibile in linguaggio macchina. Il bytecode potrà essere eseguito da una specifica macchina virtuale (la più conosciuta è quella di Java), che è uno strato di software intermedio tra la macchina reale fisica, ed il codice sorgente. Si adotta questo tipo di soluzione per rendere più facile programmare prescindendo dalle caratteristiche di una specifica struttura fisica e permettendo così al software di essere eseguibile su tutte le piattaforme sulle quali è installabile la macchina virtuale stessa.

Il motivo per cui non abbiamo finora visto in questa rubrica (dedicata all’insegnamento della programmazione ai più piccoli ed ai principianti in genere) linguaggi di programmazione compilati sta nel fatto che i linguaggi interpretati sono sì più lenti (dato che la traduzione è simultanea all’esecuzione), ma con essi i programmi sono di solito più facili da realizzare. Durante la stessa stesura del programma possiamo infatti provare ad eseguirlo e così accorgerci di eventuali errori, facilitando il debugging. Questa caratteristica ha indotto i programmatori di linguaggi a scegliere di solito la soluzione del linguaggio interpretato per creare linguaggi ed ambienti di sviluppo didattici, ma ci sono anche eccezioni e non di certo marginali. Un’altra distinzione che possiamo fare è tra linguaggi realizzati appositamente per uno scopo, come possono essere quelli creati per insegnare la programmazione (molto interessanti ai fini di questa rubrica) e linguaggi a scopi generali (general-purpose, in inglese), ma esistono anche altri criteri di classificazione dei linguaggi di programmazione.

Massimo Messina