Wie führt die CPU ein Porgramm aus wenn die JVM beim interpretieren anscheinend keinen Maschinencode erzeugt?
Ich habe jetzt mehrmals gelesen dass die JVM beim interpretieren keinen Maschinencode generiert. Wie kann den ein Programm überhaupt von der CPU dann ausgeführt werden? Ich habe auch gelesen, dass kein Maschinencode beim interpretieren erzeugt wird (ausser beim JIT natürlich was ich verstanden habe) sondern Maschinenbefehle. Ich habe doch gelernt dass die CPU nur Programme ausführen kann mittels einem Maschinencode? Und wie kann die JVM überhaupt ein Programm ohne die CPU ausführen Ich verstehe jetzt gar nichts mehr...
4 Antworten
Ich habe jetzt mehrmals gelesen dass die JVM beim interpretieren keinen Maschinencode generiert.
Sicher dass du das richtig gelesen hast?
Das Java Programm welches du startest enthält keinen Maschinencode.
Die JVM interpretiert den Code im Java Programm und übersetzt diesen in die zu deiner Plattform passenden Maschinenbefehle.
Ich habe auch gelesen, dass kein Maschinencode beim interpretieren erzeugt wird [...] sondern Maschinenbefehle.
Dacht ich mir doch dass das nur ein Missverständnis war.
Das ist eine reine Begrifflichkeitssache.
Maschinencode ist eine Liste an Maschinenbefehlen.

ach so der maschinencode wird erzeugt aber nur nicht gespeichert. Sofern ich das richtig aufgefasst habe..
Genau, das ist der Unterschied zwischen sprachen wie Java oder Python, die eine Laufzeitumgebung erfordern und sprachen wie C++ die eben für die Zielarchitektur Compiled werden.
Erstere lassen sich super einfach auf jedes Gerät portieren auf dem eine entsprechende Laufzeitumgebung installiert ist, durch diese Übersetzung die aber während der Laufzeit stattfindet, ist die Performance dieser Programmiersprachen schlechter.
Bei C++ hast du im fertigen Programm den direkten maschinencode stehen, aber für die Portierung auf andere Architekturen musst du neu compilen.
Die dritte Variante wäre natürlich direkt maschinencode oder Assembler zu schreiben, das steht dir jederzeit frei falls du einen spontanen Anflug von Selbsthass bekommst. Dann musst du eben selbst darauf achten wie die Befehle von der Zielarchitektur interpretiert werden und für das Programm auf eine neue Architektur musst du halt alles umschreiben ¯\_(ツ)_/¯
Vielen Dank für deinen ausführlichen Kommentar. Maschinencode oder Assembler zu schreiben wäre ausser Reichweite meiner geistigen Möglichkeiten ^.^
Falls dich sowas interessiert kann ich dir sehr die Videoreihe von Ben Eater empfehlen in welcher er "hello world" from scratch programmiert.
https://youtube.com/playlist?list=PLowKtXNTBypFbtuVMUVXNR0z1mu7dp7eH
Die Einfachheit eines alten 8Bit Prozessor ist sehr gut geeignet um zu verstehen wie maschinencode funktioniert und wie Computer im allgemeinen arbeiten.
Und wenn du noch tiefer in die Funktion einer CPU einsteigen möchtest:
https://youtube.com/playlist?list=PLowKtXNTBypGqImE405J2565dvjafglHU
Danke. Ich werde es mir interessehalber ansehen. Ich glaube aber, dass mir dies dann doch leider zu schwierig ist.
Eine Frage noch bist du dir bei deinem Kommentar wirklich aus eigener Erfahrung sicher oder hast du das "nur" auf Wikipedia gelesen.
Der Wiki Artikel dient mehr zur Unterstreichung dass du vermutlich nur den Wortlaut falsch interpretiert hast.
Eine CPU versteht keinen Programmcode, dass heißt: das was sie CPU zu Beginn eines jeden cycle aus dem speicher lädt, ist immer ein Maschinenbefehl.
Um auch auf die Diskussion unter der anderen Antwort einzugehen: Ob JVM nun in Echtzeit interpretiert, oder einen JIT Compiler darüber laufen lässt, das kann ich dir so direkt nicht beantworten. Ich bin kein Programmierer und solche Details sind mir auch recht egal. Ich wollte mit meiner Antwort auf die Grundlagen hinweisen.
Die ISA der JVM ist relativ nahe an real existierenden ISAs und dabei abstrakt genug, um sie entsprechend einfach emulieren zu können.
Wenn du auf einem X86 eine ARM-CPU emulierst, dann ist das im Kern auch nichts anderes.
Wobei die 'Emulation' natürlich leichtgewichtig ist, weil Du ja gerade keien HW-Platform mitemulieren mußt.
Die JVM ist meines wissens nach doch immer ein JIT Compiler und Interpretiert den Bytecode nicht.
Im Fall eines Interpreters hast du eben ein Programm in der Richtung:
executeIf(bedingung, when, otherwise)
{
if(bedingung)
when();
else
otherwise();
}
Dieser Code wird in Maschinencode übersetzt und bildet den Interpreter. Bedingung, When, Otherwise sind eben die Dinge die im Code stehen.
Also der Code bringt den Interpreter (Programm in Maschinensprache) dazu sich genau so zu verhalten, wie es der Code vorschreibt.
habe ich ganz anders gelesen. Ich habe gelesen dass die JVM entscheidet ob es Just in tim kompiliert wird oder interpretiert wird. Je nach dem ob eine Codebildung mehrmals vorkommt oder eben zum ersten Mal. Aber Danke trotzdem! Eventuell liege ich auch falch by the way
Ich hätte es eben nur so gelesen, dass sie immer JIT compiliert, aber eventuell gibt es hier Entscheidungen ob das compilieren zeitaufwändiger ist als das Kompilieren. Sicher kann ich es nicht sagen, aber ich hätte es zumindest so nicht im Kopf.
das compilieren ist zeitaufwändiger als das Kompilieren? Ich glaube du hast ein durcheinander oder bin ich es? lol
Die JVM ist ja das Programm, das auf der CPU ausgeführt wird. Es ist halt nur ein sehr spezielles und flexibles Programm, das sich so verhält, wie es der kompilierte Java-Code gerade verlangt.
So wie ein Grafikprogramm, das ein Foto von Dir anzeigt, auch nicht weiß, wie Du aussiehst. Es kann aber die in einer Grafik-Datei hinterlegten Bildinformationen geeignet interpretieren und dann zur Anzeige bringen.
habe ich ganz anders gelesen. Ich habe gelesen dass die JVM entscheidet ob es Just in time kompiliert wird oder interpretiert wird. Je nach dem ob eine Codebildung mehrmals vorkommt oder eben zum ersten Mal. Aber Danke trotzdem! Eventuell liege ich auch falch by the way
Weil Chatgpt gibt mir folgende Antwort: Nein, im reinen Interpretationsmodus erzeugt die JVM keinen dauerhaften Maschinencode. Lassen Sie uns die Details noch einmal klären: