2009-01-18 5 views
53

Ich verstehe nicht den Unterschied zwischen LLVM und Java (Bytecode), was sind sie?Was sind die Unterschiede zwischen LLVM und Java-Bytecode?

-edit- durch 'was sind sie' ich meine die Unterschiede zwischen LLVM und Java (Bytecode) nicht was sind LLVM und Java.

+18

Im Namen derer, die wirklich verstanden haben, was Sie gefragt haben, möchte ich mich für all die dummen Antworten entschuldigen, die Sie bekommen haben. :-( – Ken

+17

Wenn die Frage zweideutig 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 nachlesen. Als ich antwortete, war deine Frage wie "Unterschied zwischen llvm und java ". Der Kommentar von Ken klingt ziemlich arrogant. –

+2

Liebe den Kommentar Ken. Sorry AcidZombie24 für einige dieser Antworten. – user254492

Antwort

71

Angenommen, Sie JVM bedeuten anstatt Java:

Die LLVM ist eine niedriges Niveau registerbasierten virtuelle Maschine. Es ist entworfen, um die zugrunde liegende Hardware zu abstrahieren und eine klare Linie zwischen einem Compiler-Back-End (Maschinencode-Generierung) und Front-End (Analyse usw.) zu zeichnen.

Die JVM ist eine Stack-basierte virtuelle Maschine auf einer viel höheren Ebene. Die JVM bietet Speicherbereinigung, hat die Vorstellung von Objekten und virtuellen Methodenaufrufen und mehr. Daher bietet die JVM eine viel höhere Infrastruktur für Sprachinteroperabilität (ähnlich der Microsoft CLR).

(Es ist möglich, diese Abstraktionen über LLVM zu bauen wie es möglich ist, sie auf der Spitze C. zu bauen)

+1

LLVM hat Garbage Collector Unterstützung [mehr hier] (http://llvm.org/docs/GarbageCollection .html) –

+11

@Robert Zaremba Haben Sie jemals versucht, Garbage Collection mit LLVM zu implementieren? Ich habe das. Sie müssen grundsätzlich alles selbst machen (sie bieten nicht einmal einen einfachen Garbage Collector, obwohl es ein veraltetes Beispiel gibt). LLVM stellt nur intrinsics zur Verfügung, damit Ihr Code in den GC einhakt. Im Gegensatz zur JVM, die einen eingebauten obligatorischen Garbage Collector bietet, der automatisch auf allen Objekten funktioniert s. – mgiuca

+0

@mgiuca Nach 5 Jahren ist ARC in Swift viel besser als Java GC. https://www.quora.com/Why-doesnt-Apple-Swift-adopt-the-memory-management-method-of-garbage-collection-like-in-Java –

-2

Java ist eine Programmiersprache, die die JVM als Mittel der „Just in Time verwendet "(JIT) Ausführung, während LLVM ist ein Compiler-Baukasten zur Entwicklung neuer Sprachen und Front-Ends für bestehende Sprachen. LLVM hat haben eine JIT-Engine, aber es muss nicht verwendet werden, wenn Sie es nicht benötigen. Sie könnten LLVM-Assembler, Byte-Code oder plattformspezifischen Assembler auswerfen, anstatt die JIT-Ausführung zu verwenden.

22

Es ist schade, dass diese Frage auf den falschen Fuß kam. Ich suchte nach einem detaillierteren Vergleich.

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

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

+1

"Ich glaube, dass ein Vorteil davon ist, dass der Compiler muss keine Register zuweisen, aber ich bin mir nicht sicher. " Nicht sicher, dass. ISTR der Vorteil ist, dass Stack-basierte ist einfacher zu überprüfen. –

+1

"Ich glaube, dass ein Vorteil davon ist, dass der Compiler keine Register zuweisen muss, aber ich bin mir nicht sicher." - Der LLVM-basierte Compiler muss sich nicht mit der Registerzuordnung befassen - er ist eher eine Form von SSA. LLVM/JVM, um effizient zu laufen ** muss ** tun, da im allgemeinen Speicher ist viel viel langsamer als CPU-Register (oder vielmehr sogar langsamer). –

+4

Das Laden von Werten auf Stapel ist ** vom Leistungspunkt her ** nachteilig. Schauen Sie sich [diese] (http://static.usenix.org/events05/full_papers/p153-yunhe.pdf) pdf an. –