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?
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?
Antworten:
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.)
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?
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.
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.