Was sind die Unterschiede zwischen LLVM und Java-Bytecode?

Lesezeit: 5 Minuten

Ich verstehe den Unterschied zwischen LLVM und Java (Bytecode) nicht, was ist das?

-Bearbeiten- Mit “was sind sie” meine ich die Unterschiede zwischen LLVM und Java (Bytecode), nicht was LLVM und Java sind.

  • 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

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.)

  • LLVM unterstützt Garbage Collector mehr hier

    – Robert Zaremba

    16. März 2011 um 16:31 Uhr

  • @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

  • @mgiuca Nach 5 Jahren ist ARC in Swift viel besser als Java GC. quora.com/…

    – James Lei

    1. Mai 2016 um 6:46 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

Benutzer-Avatar
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 Dies 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.

1206050cookie-checkWas sind die Unterschiede zwischen LLVM und Java-Bytecode?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy