Ich verstehe den Unterschied zwischen LLVM-Bitcode und Java-Bytecode nicht, was ist das?
-Bearbeiten- Mit “was sind sie” meine ich die Unterschiede zwischen LLVM-Bitcode und Java-Bytecode, nicht was LLVM und Java sind.
Ich verstehe den Unterschied zwischen LLVM-Bitcode und Java-Bytecode nicht, was ist das?
-Bearbeiten- Mit “was sind sie” meine ich die Unterschiede zwischen LLVM-Bitcode und Java-Bytecode, nicht was LLVM und Java sind.
Angenommen, Sie meinen eher JVM als Java:
Das LLVM ist ein niedriges Niveau Registerbasierte virtuelle Maschine. 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 viel höherer Ebene. Die JVM bietet Garbage Collection, hat die Vorstellung von Objekten und virtuellen Methodenaufrufen und mehr. Somit stellt die JVM eine viel höhere Infrastruktur für Sprachinteroperabilität bereit (ähnlich wie Microsofts CLR).
(Es ist möglich, diese Abstraktionen über LLVM zu erstellen, genauso wie es möglich ist, sie auf C zu erstellen.)
@Robert Zaremba Haben Sie jemals versucht, 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 herumschwirrt). LLVM stellt nur intrinsische Elemente für Ihren Code bereit, um sich in den GC einzuklinken. Im Gegensatz zur JVM, die einen integrierten obligatorischen Garbage Collector bereitstellt, der automatisch für alle Objekte funktioniert.
– mgiuca
13. Mai 2011 um 6:54 Uhr
Ist nicht auch einer der Unterschiede, dass JVM fast wie ein Interpreter ist, da der Benutzer es installiert haben 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 gestartet darüber lernen)?
– Benutzer
12. Mai 2020 um 7:57 Uhr
(Wahrscheinlich beschreibe ich JIT vs. AOT, wo JVM häufiger für JIT und LLVM AOT verwendet wird?)
– Benutzer
12. Mai 2020 um 8:00 Uhr
Owen
Schade, dass diese Frage auf dem falschen Fuß angekommen ist. Ich bin auf der Suche nach einem detaillierteren Vergleich darauf gestoßen.
Der größte Unterschied zwischen JVM-Bytecode und LLVM-Bitcode besteht darin, dass JVM-Anweisungen stapelorientiert sind, LLVM-Bitcode hingegen nicht. Das bedeutet, dass JVM-Bytecode Werte nicht in Register lädt, sondern Werte auf einen Stack 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 mir nicht sicher.
LLVM-Bitcode kommt dem Code auf Maschinenebene näher, ist jedoch nicht an eine bestimmte Architektur gebunden. Ich denke zum Beispiel, dass LLVM-Bitcode eine beliebige Anzahl logischer Register verwenden kann. Vielleicht kann sich hier jemand zu Wort melden, der sich besser mit LLVM auskennt?
“Ich glaube, ein Vorteil davon ist, dass der Compiler keine Register zuweisen muss, aber ich bin mir nicht sicher.”. Nicht sicher, dass. ISTR hat den Vorteil, dass Stack-basiert einfacher zu verifizieren ist.
– JD
26. April 2010 um 18:44 Uhr
“Ich glaube, ein Vorteil davon ist, dass der Compiler keine Register zuweisen muss, aber ich bin mir nicht sicher.” – LLVM-basierter Compiler muss sich nicht mit der Registerzuordnung befassen – es ist eher eine Form von SSA. LLVM/JVM für eine effiziente Ausführung muss Tun Sie es, da der Speicher im Allgemeinen viel langsamer ist als die CPU-Register (oder eher noch langsamer).
– Maciej Piechotka
8. November 2010 um 19:39 Uhr
Das Laden von Werten auf dem Stack ist Nachteil aus Leistungssicht. Ansehen Das pdf.
– OM Nom Nom
8. April 2012 um 13:55 Uhr
Was ist der Unterschied zwischen Bitcode und Bytecode? bedeuten sie dasselbe oder gibt es etwas anderes?
– asg
27. September 2017 um 8:51 Uhr
llvm IR (Zwischendarstellung) geht davon aus, dass Sie über unendlich viele Register verfügen, mit denen Sie arbeiten können. Das llvm-Backend ordnet diese Register physischen Registern zu, abhängig von der Architektur, auf die Sie abzielen.
– wfbarksdale
13. März 2018 um 3:44 Uhr
JVM-Bytecodes und LLVM-Bytecodes haben Ähnlichkeiten und Unterschiede. Hinsichtlich der Ähnlichkeiten sind dies zwei Zwischenprogrammdarstellungen. 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.
Allerdings sind JVM-Bytecodes und LLVM-Bytecodes sehr unterschiedlich in Zweck und Design. In der Vergangenheit wurden JVM-Bytecodes entworfen, um über ein Netzwerk, z. B. das Internet, verteilt und im lokalen Computer über eine virtuelle Maschine interpretiert zu werden. Das ist einer der Gründe, warum es stapelbasiert ist: Normalerweise sind stapelbasierte Bytecodes kleiner.
Vielleicht hat man in seinen Anfängen auch gedacht, dass die LLVM-Bytecodes interpretiert werden, aber wenn es 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 Static Single Assignment-Format codiert, das eher einer mathematischen Abstraktion eines Programms als einer tatsächlichen, ausführbaren Assemblierung gleicht. So gibt es zum Beispiel Anweisungen wie Phi-Funktionen im LLVM IR, die 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 und das tut), ist dies nicht die wichtigste Art, wie die LLVM-IR verwendet wird.
Java ist eine Programmiersprache, die die JVM als Mittel zur “Just in Time” (JIT)-Ausführung verwendet, während LLVM ein Compiler-Baukasten ist, der darauf abzielt, neue Sprachen und Frontends für bestehende Sprachen zu entwickeln. LLVM tut über eine JIT-Engine verfügen, diese muss jedoch nicht verwendet werden, wenn Sie sie nicht benötigen. Sie könnten LLVM-Assembler, Bytecode oder plattformspezifischen Assembler wegwerfen, anstatt die JIT-Ausführung zu verwenden.
Im Namen derjenigen 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
17. April 2009 um 17:27 Uhr
Wenn die Frage mehrdeutig formuliert ist, sind nicht die Antworten dumm, sondern die Frage. Entschuldigung, aber wer sagt, dass die Antworten unten “dumm” sind, sollte alles in diesem Thread noch einmal lesen. Als ich Ihre Frage beantwortete, lautete sie: “Unterschied zwischen llvm und Java”. Der Kommentar von Ken klingt ziemlich arrogant.
– Johannes Schaub – litb
18. April 2009 um 14:23 Uhr
Ich liebe den Kommentar Ken. Sorry AcidZombie24 für einige dieser Antworten.
– Benutzer254492
1. März 2010 um 10:05 Uhr
Weitere Informationen zum LLVM-Bitcode finden Sie hier: llvm.org/docs/BitCodeFormat.html
– Hari
16. März um 13:12 Uhr