In der Regel ist der kompilierte Code genau der Befehlssatz, den die CPU benötigt, um das Programm "auszuführen". In Java ist der kompilierte Code ein exakter Befehlssatz für eine "virtuelle CPU", die auf jeder physischen Maschine gleich funktionieren muss.
In gewisser Weise entschieden die Designer der Java-Sprache, dass die Sprache und der kompilierte Code plattformunabhängig sein sollten. Da der Code jedoch letztendlich auf einer physischen Plattform ausgeführt werden muss, entschieden sie sich dafür, den gesamten plattformabhängigen Code einzufügen die JVM.
Diese Anforderung für eine JVM steht im Gegensatz zu Ihrem Turbo C-Beispiel. Mit Turbo C erzeugt der Compiler plattformabhängigen Code, und es ist keine JVM erforderlich, da das kompilierte Turbo C-Programm direkt von der CPU ausgeführt werden kann.
Mit Java führt die CPU die plattformabhängige JVM aus. Diese ausgeführte JVM führt dann den plattformunabhängigen Java-Bytecode aus, vorausgesetzt, Sie verfügen über eine JVM, auf der sie ausgeführt werden kann. Sie könnten sagen, dass Sie beim Schreiben von Java-Code nicht programmieren, dass der Code auf der physischen Maschine ausgeführt wird, sondern den Code, der auf der Java Virtual Machine ausgeführt werden soll.
Der einzige Weg, wie all dieser Java-Bytecode auf allen virtuellen Java-Maschinen funktioniert, besteht darin, dass ein ziemlich strenger Standard für die Funktionsweise von virtuellen Java-Maschinen geschrieben wurde. Dies bedeutet, dass unabhängig davon, welche physische Plattform Sie verwenden, der Teil, in dem der Java-Bytecode mit der JVM verbunden ist, garantiert nur in eine Richtung funktioniert. Da alle JVMs genau gleich funktionieren, funktioniert derselbe Code überall genau gleich, ohne neu kompiliert zu werden. Wenn Sie die Tests nicht bestehen können, um sicherzustellen, dass sie identisch sind, dürfen Sie Ihre virtuelle Maschine nicht als "Java Virtual Machine" bezeichnen.
Natürlich gibt es Möglichkeiten, die Portabilität eines Java-Programms zu beeinträchtigen. Sie könnten ein Programm schreiben, das nach Dateien sucht, die nur auf einem Betriebssystem gefunden werden (z. B. cmd.exe). Sie können JNI verwenden, mit dem Sie kompilierten C- oder C ++ - Code effektiv in eine Klasse einfügen können. Sie können Konventionen verwenden, die nur für ein bestimmtes Betriebssystem funktionieren (z. B. die Annahme, dass ":" Verzeichnisse trennt). Sie müssen Ihr Programm jedoch garantiert nie für einen anderen Computer neu kompilieren, es sei denn, Sie tun etwas ganz Besonderes (wie JNI).