Erzeugt Java Virtual Machine 0 und 1?

427
Foo

Es tut mir leid, dies ist eine sehr grundlegende Informatikfrage. Erzeugt Java Virtual Machine 0 und 1 oder generiert es Assemblersprachcode? Wenn der Assembler-Code generiert wird, ist an den Prozessor ein Assembler angeschlossen, der diesen in 0 und 1 konvertiert. Oder benötigt der Prozessor einen Assembler, wenn er 0s und 1s generiert? Wenn ja, für was?

0
Alles besteht aus 0 und 1. Sogar Montagecode. Valmiky Arquissandas vor 9 Jahren 1
Wenn Sie "0s und 1s" sagen, klingt das so, als würden Sie sich wirklich auf [Maschinencode] beziehen (https://en.wikipedia.org/wiki/Machine_code). Wyzard vor 9 Jahren 1

2 Antworten auf die Frage

2
Jason C

Der Java- Compiler (nicht die JVM) verwendet Java-Quellcode (der im Wesentlichen nur 0 und 1 ist, aber eine bestimmte Anzahl von 0 und 1, die Informationen darstellen können, die für den Menschen leicht zu handhaben sind, z. B. lesbarer Text) und kompiliert es zu Java-Bytecode, der 0 und 1 mit einer anderen Bedeutung ist.

Java-Bytecode ist konzeptionell wie "Assembler", außer dass es plattformunabhängige Anweisungen sind, die von der virtuellen Java-Maschine interpretiert werden sollen . Die JVM fungiert als "Übersetzer" zwischen Java-Bytecode und nativem Bytecode (d. H. Maschinenanweisungen für die eigentliche Hardware, auf der sie ausgeführt wird) - konzeptionell wie ein Nintendo-Emulator. Auf diese Weise kann kompiliertes Java auf jeder Plattform ausgeführt werden.

Um Ihre Frage direkt zu beantworten: Die JVM generiert keinen Java-Bytecode. Der Java-Compiler macht dies, und die JVM interpretiert diesen Bytecode und "macht Dinge möglich".

Moderne JVMs sind jedoch heutzutage mehr als nur Interpretieren. Die "HotSpot" -Technologie, von der Sie vielleicht gehört haben, ermöglicht es der JVM, dynamisch zu bestimmen, welche Teile Ihres Java-Bytecodes häufig ausgeführt werden (und daher davon profitieren könnten) eine Beschleunigung) und nehmen Sie dann diese Teile und übersetzen Sie sie während des Betriebs in den vollständigen nativen Bytecode (damit der ursprüngliche Java-Bytecode nicht mehr interpretiert wird und der neue, schnellere native Bytecode direkt ausgeführt wird). Dies geschieht transparent für Ihr Java-Programm. Vor langer Zeit hat Java viel Kritik geübt, weil es "langsam" ist, aber diese Tage sind meistens mit dem Aufkommen von HotSpot und ähnlichen Techniken vorbei.

In gewissem Sinne erzeugen moderne JVMs also "0s und 1s", indem sie aus den eingegebenen Java-Anweisungen zusätzlichen nativen Code generieren. Seien Sie jedoch vorsichtig, wenn Sie auf Daten als "0s und 1s" verweisen - jedes digitale Datenelement ist "0s und 1s" (oft in Gruppen von 8 binären Ziffern, "Byte" genannt ), vom Maschinencode über den Programmcode bis zum Text zu Bildern zu MP3s zu was auch immer.

Sie können einen schönen writeup finden, wie die JVM arbeitet hier .

Für sehr konkrete Spezifikationen der Java-Sprache, des Java-Bytecodes und des Verhaltens des Compilers und der virtuellen Maschine finden Sie hier sowohl die Sprache als auch die Spezifikation der virtuellen Maschine .

0
kevin628

Es generiert Java-Bytecode, einen speziellen Befehlssatz, der nur für die JVM gilt. Es ist vergleichbar mit nativem Maschinencode (Nullen und Einsen).

Siehe hier: Java-Bytecode (Wikipedia) (scrollen Sie nach unten zum Beispielabschnitt).