Che cos'è una lingua intermedia?
Nella programmazione informatica, quando un codice sorgente leggibile dall'uomo viene analizzato da un compilatore, il compilatore spesso traduce i comandi di origine in una sequenza di istruzioni che non sono del tutto un codice macchina nativo ma possono essere ulteriormente elaborati, ottimizzati o compilati dal compilatore o da altri software utensili. I file prodotti contengono istruzioni che si dice siano in una lingua intermedia, perché la lingua utilizzata dal compilatore non è significativa per il sistema operativo più grande né la lingua utilizzata dal programmatore per scrivere il codice in primo luogo, ma invece è una lingua che funge da ponte tra la scrittura e l'esecuzione del programma. Talvolta viene utilizzato un linguaggio intermedio per consentire a un compilatore di eseguire ottimizzazioni molto precise in modo che il programma venga eseguito in modo più efficiente, ma può anche essere utilizzato per produrre file di output che sono portatili tra sistemi diversi e incompatibili. La sintassi effettiva del linguaggio può assomigliare al codice macchina o ad altri tipi di bytecode leggibile non umano, oppure il linguaggio può essere solo un linguaggio di programmazione informatica multipiattaforma esistente.
Se utilizzato per l'ottimizzazione del compilatore, un compilatore di linguaggio 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ò essere suddivisa in dozzine di istruzioni del 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 prima dover associare il codice a eventuali implementazioni o librerie native. Una volta completato, il file di codice intermedio può quindi essere compilato ulteriormente per creare un file binario nativo, oppure può essere eseguito attraverso un altro programma, noto come interprete, che eseguirà il codice compilandolo in istruzioni native secondo necessità.
Alcuni linguaggi, come Java®, usano 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 ricorda il codice macchina o il linguaggio assembly. Il bytecode è archiviato in file in modo indipendente dalla piattaforma, il che significa che può essere trasferito a qualsiasi sistema informatico o dispositivo in grado di eseguire un interprete. Una volta che il bytecode si trova su un sistema, può essere eseguito come programma interpretato oppure può essere compilato per essere eseguito in modo nativo sul sistema di destinazione.
In alcuni casi, un linguaggio informatico è 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 ha già stabilito interpreti multipiattaforma. La lingua intermedia risultante in questo caso è leggibile dall'uomo. Un esempio di un linguaggio di programmazione per computer che viene utilizzato anche come linguaggio intermedio è JavaScript®, che ha il vantaggio di poter funzionare in quasi tutti i browser Web su qualsiasi piattaforma, a partire dal 2011.