Wie führt die CPU ein Porgramm aus wenn die JVM beim interpretieren anscheinend keinen Maschinencode erzeugt?

4 Antworten

Ich habe jetzt mehrmals gelesen dass die JVM beim interpretieren keinen Maschinencode generiert.

Sicher dass du das richtig gelesen hast?

Bild zum Beitrag

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.

Woher ich das weiß:Berufserfahrung – Administrator mit über 12 Jahren Berufserfahrung
 - (Computer, PC, CPU)

Frage999713 
Beitragsersteller
 08.01.2025, 16:03

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:

  1. Reine Interpretation:
  • Wenn die JVM im reinen Interpretationsmodus arbeitet, übersetzt sie jeden einzelnen Bytecode-Befehl direkt in die entsprechenden CPU-Befehle, aber dies geschieht während der Ausführung und es wird keine native Maschinencode-Datei gespeichert. Es handelt sich um eine momentane Übersetzung, die in Echtzeit erfolgt.
Frage999713 
Beitragsersteller
 08.01.2025, 16:04
@Frage999713

ach so der maschinencode wird erzeugt aber nur nicht gespeichert. Sofern ich das richtig aufgefasst habe..

Krabat693  08.01.2025, 16:12
@Frage999713

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 ¯\_(ツ)_/¯

Frage999713 
Beitragsersteller
 09.01.2025, 11:21
@Krabat693

Vielen Dank für deinen ausführlichen Kommentar. Maschinencode oder Assembler zu schreiben wäre ausser Reichweite meiner geistigen Möglichkeiten ^.^

Krabat693  09.01.2025, 11:29
@Frage999713

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

Frage999713 
Beitragsersteller
 09.01.2025, 11:56
@Krabat693

Danke. Ich werde es mir interessehalber ansehen. Ich glaube aber, dass mir dies dann doch leider zu schwierig ist.

Frage999713 
Beitragsersteller
 08.01.2025, 15:31

Eine Frage noch bist du dir bei deinem Kommentar wirklich aus eigener Erfahrung sicher oder hast du das "nur" auf Wikipedia gelesen.

Krabat693  08.01.2025, 16:05
@Frage999713

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.

Frage999713 
Beitragsersteller
 08.01.2025, 15:24

Vielen Dank für deine Geduld mit einem Laien :-)

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.


Frage999713 
Beitragsersteller
 08.01.2025, 15:26

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

Kelec  08.01.2025, 15:38
@Frage999713

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.

Frage999713 
Beitragsersteller
 09.01.2025, 11:23
@Kelec

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.


Kelec  08.01.2025, 13:46

Die JVM ist aber kein Interpreter sondern ein JIT Compiler.

zalto  08.01.2025, 13:55
@Kelec

Compiler ist der javac, während java einfach nur ausführt, was es bekommt.

Kelec  08.01.2025, 14:01
@zalto

javac kompiliert in Bytecode.

Java nimmt den Bytecode und hat im Hintergrund einen JIT Compiler (der den Bytecode whärend der Ausführung in Maschinencode compiliert) laufen, daher ist Java ja auch viel schneller als zB Standard Python.

Frage999713 
Beitragsersteller
 08.01.2025, 15:28
@Kelec

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