Zazwyczaj skompilowany kod jest dokładnym zestawem instrukcji, których CPU wymaga do „wykonania” programu. W Javie skompilowany kod to dokładny zestaw instrukcji dla „wirtualnego procesora”, który musi działać tak samo na każdej fizycznej maszynie.
Dlatego w pewnym sensie projektanci języka Java zdecydowali, że język i skompilowany kod będą niezależne od platformy, ale ponieważ kod ostatecznie musi działać na platformie fizycznej, zdecydowali się umieścić cały kod zależny od platformy w JVM.
Ten wymóg dotyczący maszyny JVM różni się od przykładu z Turbo C. Dzięki Turbo C kompilator będzie tworzył kod zależny od platformy i nie ma potrzeby tworzenia podobnej maszyny JVM, ponieważ skompilowany program Turbo C może być wykonywany bezpośrednio przez procesor.
W przypadku języka Java procesor wykonuje maszynę JVM, która jest zależna od platformy. Ta działająca maszyna JVM wykonuje następnie kod bajtowy Java, który jest niezależny od platformy, pod warunkiem, że dostępna jest maszyna JVM do wykonania na niej. Można powiedzieć, że pisząc kod w Javie, nie programuje się kodu do wykonania na maszynie fizycznej, pisze się kod, który ma być wykonany na wirtualnej maszynie języka Java.
Jedynym sposobem, w jaki cały ten kod bajtowy Java działa na wszystkich maszynach wirtualnych Javy, jest napisanie dość surowego standardu działania maszyn wirtualnych Java. Oznacza to, że niezależnie od używanej platformy fizycznej część, w której kod bajtowy Java łączy się z maszyną JVM, będzie działać tylko w jedną stronę. Ponieważ wszystkie maszyny JVM działają dokładnie tak samo, ten sam kod działa wszędzie dokładnie tak samo bez ponownej kompilacji. Jeśli nie możesz przejść testów, aby upewnić się, że jest taki sam, nie możesz nazywać swojej maszyny wirtualnej „maszyną wirtualną Java”.
Oczywiście istnieją sposoby na złamanie przenośności programu Java. Możesz napisać program, który szuka plików tylko w jednym systemie operacyjnym (na przykład cmd.exe). Możesz użyć JNI, który efektywnie pozwala na umieszczenie skompilowanego kodu C lub C ++ w klasie. Możesz użyć konwencji, które działają tylko dla określonego systemu operacyjnego (np. Zakładając, że „:” oddziela katalogi). Ale masz gwarancję, że nigdy nie będziesz musiał ponownie kompilować swojego programu na inną maszynę, chyba że robisz coś naprawdę wyjątkowego (jak JNI).