Che cos’è una lingua intermedia?

Nella programmazione del computer, quando il codice sorgente leggibile dall’uomo viene analizzato da un compilatore, il compilatore spesso traduce i comandi sorgente in una sequenza di istruzioni che non sono proprio codice macchina nativo ma possono essere ulteriormente elaborati, ottimizzati o compilati dal compilatore o da altro software utensili. I file che vengono prodotti contengono istruzioni che si dice siano in un linguaggio intermedio, perché il linguaggio utilizzato dal compilatore non è significativo per il sistema operativo più grande né il linguaggio utilizzato dal programmatore per scrivere il codice in primo luogo, ma invece è un linguaggio che funge da ponte tra la scrittura e l’esecuzione del programma. A volte viene utilizzato un linguaggio intermedio per consentire a un compilatore di effettuare ottimizzazioni molto precise in modo che il programma funzioni in modo più efficiente, ma può anche essere utilizzato per produrre file di output che sono portabili tra sistemi diversi e incompatibili. La sintassi effettiva del linguaggio può assomigliare al codice macchina o ad altri tipi di bytecode non leggibili dall’uomo, oppure il linguaggio può essere solo un linguaggio di programmazione per computer multipiattaforma esistente.

Quando viene utilizzato per l’ottimizzazione del compilatore, un compilatore di lingua prende ogni istruzione in un file di codice sorgente e suddivide il comando nella lingua intermedia. Una singola istruzione di programmazione leggibile dall’uomo può suddividersi in dozzine di istruzioni in linguaggio macchina, quindi il linguaggio intermedio crea un livello di astrazione che il compilatore può utilizzare per identificare le aree del codice in cui è possibile effettuare ottimizzazioni senza dover prima associare il codice qualsiasi implementazione o libreria nativa. Una volta completato, il file di codice intermedio può essere ulteriormente compilato per creare un file binario nativo, oppure può essere eseguito tramite un altro programma, noto come interprete, che eseguirà il codice compilandolo in istruzioni native secondo necessità.

Alcuni linguaggi, come Java®, utilizzano un linguaggio intermedio per creare file compilati ottimizzati ma anche portabili su altri sistemi informatici. Questo tipo di codice a volte è noto come bytecode e assomiglia al codice macchina o al linguaggio assembly. Il bytecode viene archiviato in file in modo indipendente dalla piattaforma, il che significa che può essere trasferito su qualsiasi sistema informatico o dispositivo in grado di eseguire un interprete. Una volta che il bytecode è su un sistema, può essere eseguito come programma interpretato o può essere compilato per essere eseguito in modo nativo sul sistema di destinazione.

In alcuni casi, un linguaggio per computer è progettato per semplificare la programmazione verso un fine specifico, come un’applicazione Web interattiva, ma i progettisti non vogliono includere compilatori, interpreti o plug-in personalizzati per sistemi diversi. In questi casi, la lingua intermedia del compilatore può essere una lingua esistente che dispone già di interpreti multipiattaforma affermati. La lingua intermedia risultante in questo caso è leggibile dall’uomo. Un esempio di linguaggio di programmazione per computer utilizzato anche come linguaggio intermedio è JavaScript®, che ha il vantaggio di poter essere eseguito in quasi tutti i browser Web su qualsiasi piattaforma, a partire dal 2011.