Il bytecode è generalmente prodotto dalla compilazione di [[codice sorgente|codici sorgenti]] (o [[File sorgente|file sorgenti]]) scritti in linguaggio [[Java (linguaggio di programmazione)|Java]], anche se è possibile produrre bytecode partendo da altri linguaggi come [[Scala (linguaggio di programmazione)|Scala]], [[Clojure]] o [[Groovy]].
La JVM è definita da una [[specifica tecnica|specifica]], mantenuta da [[Sun MicrosystemsOracle]]. Qualsiasi sistema che si comporti in modo coerente con tale specifica viene considerato come una particolare [[implementazione]] della JVM. Esistono implementazioni [[software]] per praticamente tutti i [[sistema operativo|sistemi operativi]] moderni, sia gratuite che commerciali. Inoltre, esistono implementazioni speciali per particolari ambienti [[hardware]]/[[software]], come [[telefono cellulare|telefoni cellulari]] e [[Computer palmare|palmari]]), e persino implementazioni hardware come [[Architettura_ARM#Jazelle|Jazelle]].
La disponibilità di implementazioni della macchina virtuale Java per diversi ambienti operativi è la chiave della [[portabilità]] di Java, proclamata nello [[slogan]] ''write once, run everywhere'' ("scrivi una volta, esegui dappertutto"). La macchina virtuale realizza infatti un ambiente di esecuzione omogeneo, che nasconde al software Java (e quindi al programmatore) qualsiasi specificità del [[sistema operativo]] sottostante:
==Implementazioni==
Oltre a gestire le specifiche della macchina virtuale Java, Sun MicrosystemsOracle ne fornisce anche implementazioni gratuite e parzialmente open source <ref>https[http://openjdk.dev.java.net/ OpenJDK]</ref>; le implementazioni SunOracle sono in genere viste come [[implementazione di riferimento|implementazioni di riferimento]] ma sono anche ampiamente utilizzate da utenti finali, aziende e istituzioni.
Numerose altre parti forniscono regolarmente implementazioni della macchina virtuale Java, in genere con l'intento di competere con l'implementazione SunOracle in quanto a prestazioni; in alcuni casi si tratta di implementazioni commerciali. Sono disponibili anche altre implementazioni ''[[open source]]''; fra le più note si può citare [[Waba]].
Le specifiche della JVM vengono dettate e aggiornate dalla [http://java.sun.com/ Sun Microsystems]Oracle in quanto iniziatore e mantenitore del progetto, ma vengono spesso disattese da molte delle implementazioni ''non-SunOracle'' di JVM che sono in circolazione, soprattutto per quanto riguarda il [[framework]] che ogni JVM include. Di conseguenza, le diverse JVM non sono totalmente compatibili tra loro ed occorre fare attenzione nello scrivere i programmi, se si vuole che essi funzionino su ogni JVM. La cosa migliore da fare a tale scopo sarebbe non usare le ultime caratteristiche del linguaggio introdotte dalla SUNOracle nelle JVM più recenti e usare delle [[Application programming interface|API]] "stabili", che cioè siano presenti nella JVM SUNOracle da varie versioni.
== Compilazione ''Just-In-Time'' ==
|