Wenn die JVM Java-Quelltext direkt in Maschinencode übersetzen würde, funktioniert dann das Programm nicht immer noch plattformübergreifend?
Ich habe leider einzig nur verstanden, dass es dann
a) für den Benutzer einen ziemlichen Aufwand an Wartezeit geben würde, bis dass das Programm dann ausgeführt wird, da menschenähnlichere Programmiersprache direkt in Maschinencode übersetzt werden müsste, ohne zuvor einen Java-Bytecode generiert zu haben
und dass
b) andere Programmiersprachen auch zum Java-Bytecode greifen.
Und zu guter Letzt
c) dass es dann schwierig wäre, ein Programm vor dem Abstürzen zu bewahren.
Ich verstehe aber nicht, weshalb mir ChatGPT sagt, dass es dann nicht mehr plattformübergreifend funktionieren würde. Jede Maschine hat ja eine eigene JVM, die sowieso den Java-Bytecode in einen spezifischen Maschinencode übersetzen muss. Wieso sollte es dann nicht plattformübergreifend funktionieren?
Es wäre ja einfacher, wenn jede JVM den Quelltext direkt in ihren eigenen Maschinencode übersetzen würde.
2 Antworten
> Wenn die JVM Java Quelltext direkt in maschinen code übersetzen würde funktioniert dann das Programm nicht immer noch Plattform übergreifend?
Klar würde das dann noch Plattform übergreifend funktionieren.
Java Script ist ein gutes Beispiel für so eine Sprache, auch wenn sie wenig mit Java gemeinsam hat. JavaScript wird ja interpretiert (bzw. JIT (just in time) kompiliert), ohne dass vorher aus dem ursprünglichen source code bytecode kompiliert wird. Da wird der source code optional maximal etwas optimiert, aber das Ergebnis ist trotzdem Java script syntax. Python wäre ein anderes gutes Beispiel.
> b) andere Programmiersprachen auch zum Java Byte Code greifen.
Was du vielleicht meinst ist, dass andere Sprachen ebenfalls zu Java bytecode kompiliert werden können? Zb. Kotlin oder Groovy. Das nennt man dann oft JVM (für Java Virtual machine) Sprachen. Weniger wahrscheinlich ist, dass du bindings aus Java in andere Sprachen meinst (JNI), darüber kann man nicht Plattform übergreifende Bibliotheken in Plattform spezifischen Maschinen Code ansteuern.
Bytecode kann wesentlich schneller gelesen werden, einfache Optimierungen kann man dabei auch machen.
> c) dass es dann schwierig wäre ein Programm vor dem Abstürzen zu bewahren
Durch den Kompilierungsschritt kann man sicher stellen, dass der Code auf Syntax Ebene korrekt ist. Das spricht für Byte Code über source code.
> a) für den Benutzer einen ziemlichen Aufwand an Wartezeit geben würde, bis dass das Programm dann ausgeführt wird
Das ist natürlich auch darin begründet, weil das Design eben auf diesen Zwischenschritt beruht. Bei einer Sprache die darauf ausgelegt ist, ist das vertretbar, aber natürlich ist mehr Übersetzung zur Laufzeit immer mit mehr Aufwand verbunden. JIT Compiler sind aber mittlerweile durchaus ziemlich gut.
Zusammenfassung:
Andere sprachen wie JavaScript zeigen, dass es ohne bytecode funktioniert. Die Nachteile kann man in der Praxis ausgleichen. Und JavaScript kann, in manchen Szenarien, auch schneller als Java sein. Beides ist eine valide Design Entscheidung.
Wenn die JVM Java-Quelltext direkt in Maschinencode übersetzen würde, funktioniert dann das Programm nicht immer noch plattformübergreifend?
Wenn die JVM den gesamten Compiler Huckepack trägt, wäre das im Kern machbar, bedeutet aber eben auch, daß bei jeder Ausführung komplett kompiliert werden muß.
(Es sei denn natürlich, DU würdest die Bytecodekompilate resp. nativen Kompilate Cachen udn wiederverwenden).