Bytecode
Il bytecode è un linguaggio intermedio più astratto del linguaggio macchina. È chiamato così perchè spesso le operazioni hanno un codice che occupa un solo byte, anche se la lunghezza dell'intera istruzione può variare perchè ogni operazione ha un numero specifico di parametri su cui operare. I parametri di queste operazioni possono consistere di registri o indirizzi di memoria, un pò come accade per il linguaggio macchina.
Un linguaggio intermedio come il bytecode è molto utile a coloro che realizzano linguaggi di programmazione perchè riduce la dipendenza dall'hardware e facilita la creazione degli interpreti del linguaggio stesso.
Il bytecode può anche essere usato come rappresentazione intermedia di un programma da far compilare a un tipo speciale di compilatore, chiamato compilatore just-in-time il quale traduce il bytecode in linguaggio macchina immediatamente prima dell'esecuzione del programma stesso, per velocizzarne l'esecuzione.
Un programma in bytecode è eseguito mediante una macchina virtuale, un interprete di bytecode chiamato così perchè può essere visto dal programmatore come un computer astratto che realizza al suo interno gran parte delle funzionalità di un computer reale. Questo da il vantaggio di poter scrivere programmi portabili, cioè programmi che possono essere eseguiti su diversi tipi di sistemi operativi e di architetture. Questo è un vantaggio che hanno anche i linguaggi interpretati, tuttavia un interprete di bytecode risulta essere molto più veloce di un interpete di un linguaggio ad alto livello perchè è un linguaggio con poche e semplici istruzioni e più vicino al modo di funzionamento dell'hardware del computer.
Il linguaggio più famoso tra quelli che fanno uso del bytecode è Java. Java ha sia una macchina virtuale (Java Virtual Machine) che interpreta il codice bytecode sia un compilatore just-in-time che traduce il bytecode in linguaggio macchina. La piattaforma .NET, e quindi anche il linguaggio C#, ha a disposizione tecniche simili a quelle del linguaggio Java.
Oggi, per migliorare la velocità di esecuzione, anche molti linguaggi interpretati, come Perl, PHP o Python, fanno uso del bytecode. Essi traducono il programma in bytecode e poi lo interpretano tramite una macchina virtuale. Il linguaggio Ruby, invece, non usa il bytecode, ma traduce il codice in una struttura sintattica ad albero che ricorda molto la rappresentazione intermedia che si usa nei compilatori, tale struttura viene poi usata dall'interprete per eseguire il programma.