Was sind die Unterschiede zwischen LLVM und Java-Bytecode?

73

Ich verstehe den Unterschied zwischen LLVM und Java (Bytecode) nicht. Was sind sie?

-edit- Mit "Was sind sie?" meine ich die Unterschiede zwischen LLVM und Java (Bytecode), nicht was sind LLVM und Java?

Benutzer34537
quelle
19
Im Namen derer von uns, die tatsächlich verstanden haben, was Sie gefragt haben, möchte ich mich für all die dummen Antworten entschuldigen, die Sie erhalten haben. :-(
Ken
19
Wenn die Frage mehrdeutig formuliert ist, sind die Antworten nicht dumm, aber die Frage ist. Entschuldigung, aber wer sagt, dass die Antworten unten "dumm" sind, sollte alles in diesem Thread noch einmal lesen. Als ich Ihre Frage beantwortete, war sie wie "Unterschied zwischen llvm und Java". Der Kommentar von Ken klingt ziemlich arrogant.
Johannes Schaub - litb
2
Ich liebe den Kommentar Ken. Entschuldigung AcidZombie24 für einige dieser Antworten.
user254492

Antworten:

87

Angenommen, Sie meinen eher JVM als Java:

Die LLVM ist eine auf Registern basierende virtuelle Maschine auf niedriger Ebene . Es wurde entwickelt, um die zugrunde liegende Hardware zu abstrahieren und eine klare Linie zwischen einem Compiler-Back-End (Maschinencode-Generierung) und einem Front-End (Parsing usw.) zu ziehen.

Die JVM ist eine stapelbasierte virtuelle Maschine auf einer viel höheren Ebene. Die JVM bietet Garbage Collection, hat den Begriff Objekte und virtuelle Methodenaufrufe und vieles mehr. Daher bietet die JVM eine viel höhere Infrastruktur für die Sprachinteroperabilität (ähnlich wie die CLR von Microsoft).

(Es ist möglich, diese Abstraktionen über LLVM zu erstellen, genauso wie es möglich ist, sie auf C aufzubauen.)

Nimrodm
quelle
2
LLVM hat Garbage Collector Unterstützung mehr hier
Robert Zaremba
13
@ Robert Zaremba Haben Sie jemals versucht, die Garbage Collection mit LLVM zu implementieren? Ich habe. Sie müssen im Grunde alles selbst machen (sie bieten nicht einmal einen einfachen Garbage Collector, obwohl ein veraltetes Beispiel im Umlauf ist). LLVM bietet lediglich Informationen für Ihren Code, um sich in den GC einzubinden. Im Gegensatz zur JVM, die einen integrierten obligatorischen Garbage Collector bietet, der automatisch für alle Objekte funktioniert.
mgiuca
1
@mgiuca Nach 5 Jahren ist ARC in Swift viel besser als Java GC. quora.com/…
James Lei
Ist nicht einer der Unterschiede, dass JVM fast wie ein Interpreter ist, da der Benutzer es installieren muss, um Programme auszuführen, während LLVM verwendet wird, um die architekturspezifischen ausführbaren Dateien im Voraus zu generieren (ich kann mich sehr irren, gerade erst gestartet) darüber lernen)?
Ixx
(Wahrscheinlich beschreibe ich JIT vs. AOT, wo JVM häufiger für JIT und LLVM AOT verwendet wird?)
Ixx
28

Es ist schade, dass diese Frage auf dem falschen Fuß gestellt wurde. Ich bin dazu gekommen, um einen detaillierteren Vergleich zu finden.

Der größte Unterschied zwischen JVM-Bytecode und LLVM-Bitcode besteht darin, dass JVM-Befehle stapelorientiert sind, LLVM-Bitcode hingegen nicht. Dies bedeutet, dass der JVM-Bytecode keine Werte in Register lädt, sondern Werte auf einen Stapel lädt und von dort aus Werte berechnet. Ich glaube, dass ein Vorteil davon ist, dass der Compiler keine Register zuweisen muss, aber ich bin nicht sicher.

LLVM-Bitcode ist näher an Code auf Maschinenebene, ist jedoch nicht an eine bestimmte Architektur gebunden. Zum Beispiel denke ich, dass der LLVM-Bitcode eine beliebige Anzahl von logischen Registern verwenden kann. Vielleicht kann hier jemand sprechen, der mit LLVM besser vertraut ist?

Owen
quelle
1
"Ich glaube, dass ein Vorteil davon ist, dass der Compiler keine Register zuweisen muss, aber ich bin nicht sicher." Nicht sicher, dass. ISTR hat den Vorteil, dass stapelbasiert leichter zu überprüfen ist.
JD
1
"Ich glaube, dass ein Vorteil davon ist, dass der Compiler keine Register zuweisen muss, aber ich bin nicht sicher." - Der LLVM-basierte Compiler muss sich nicht mit der Registerzuweisung befassen - er ist eher eine Form von SSA. LLVM / JVM müssen effizient ausgeführt werden , da der Speicher im Allgemeinen viel langsamer ist als die CPU-Register (oder sogar noch langsamer).
Maciej Piechotka
7
Das Laden von Werten auf einen Stapel ist aus Sicht der Leistung ein Nachteil . Schauen Sie sich dieses PDF an.
Om-Nom-Nom
Was ist der Unterschied zwischen Bitcode und Bytecode? bedeuten sie dasselbe oder gibt es noch etwas anderes?
Asgs
llvm IR (Zwischendarstellung) setzt voraus, dass Sie mit unendlich vielen Registern arbeiten können. Das llvm-Backend ordnet diese Register abhängig von der Architektur, auf die Sie abzielen, physischen Registern zu.
wfbarksdale
1

JVM-Bytecodes und LLVM-Bytecodes weisen Ähnlichkeiten und Unterschiede auf. In Bezug auf Ähnlichkeiten sind dies zwei Darstellungen des Zwischenprogramms. Somit können sie Programme darstellen, die in verschiedenen Programmiersprachen geschrieben sind. Beispielsweise gibt es Frontends, die Java, Closure, Scala usw. in JVM-Bytecodes übersetzen, und es gibt Frontends, die C, C ++, Swift, Julia, Rust usw. in LLVM-Bytecodes übersetzen.

JVM-Bytecodes und LLVM-Bytecodes unterscheiden sich jedoch in Zweck und Design erheblich. In der Vergangenheit wurden JVM-Bytecodes so konzipiert, dass sie über ein Netzwerk, z. B. das Internet, verteilt und auf dem lokalen Computer über eine virtuelle Maschine interpretiert werden. Dies ist einer der Gründe, warum es stapelbasiert ist: Normalerweise sind stapelbasierte Bytecodes kleiner.

Vielleicht wurde in seinen Anfängen auch angenommen, dass die LLVM-Bytecodes interpretiert werden, aber wenn dies passiert ist, hat sich sein Zweck im Laufe der Zeit geändert. LLVM-Bytecodes sind also eine Programmdarstellung, die analysiert und optimiert werden soll. Es ist im statischen Einzelzuweisungsformat codiert, das eher einer mathematischen Abstraktion eines Programms als einer tatsächlichen ausführbaren Assembly ähnelt. So gibt es Anweisungen wie Phi-Funktionen im LLVM-IR, die beispielsweise in typischen Computerarchitekturen keine direkte Entsprechung haben. Obwohl es möglich ist, LLVM-Bytecodes zu interpretieren (es gibt ein Tool namens lli, das Teil der LLVM-Toolchain ist, das dies tut), ist dies nicht die wichtigste Art und Weise, wie das LLVM-IR verwendet wird.

Fernando Magno Quintao Pereira
quelle
-4

Java ist eine Programmiersprache, die die JVM als Mittel zur Ausführung von "Just in Time" (JIT) verwendet, während LLVM ein Compiler-Baukasten ist, der darauf abzielt, neue Sprachen und Frontends für vorhandene Sprachen zu entwickeln. LLVM verfügt zwar über eine JIT-Engine, muss jedoch nicht verwendet werden, wenn Sie sie nicht benötigen. Sie können den LLVM-Assembler, den Bytecode oder den plattformspezifischen Assembler wegwerfen, anstatt die JIT-Ausführung zu verwenden.

Edd Barrett
quelle