Inwiefern ist LLVM Low Level?

12

Inwiefern ist LLVM (Low Level Virtual Machine) Low Level? (Zum Zeitpunkt des Schreibens fand ich diese Erweiterung der Abkürzung "LLVM" nicht auf der Website, sondern auf Wikipedia .)

Wird es als "Low Level" bezeichnet, für was es entwickelt wurde (eine Compiler-Infrastruktur) oder weil es auf einer "niedrigeren Ebene" als andere Tools funktioniert?

Als (Art) „Darstellung“ dieser ist LLVM niedrigere Ebene als die JVM und CLR , oder ist es nur entworfen für „untere Ebene“ verwendet?

Abbafei
quelle

Antworten:

16

LLVM ist niedriger als typische VMs wie JVM und CLR. Während es beispielsweise Hooks für einen Garbage Collector hat, stellt es selbst keinen Garbage Collector bereit.

Ebenso verfügt die JVM über einen integrierten JIT-Compiler (außer in wirklich alten Versionen). LLVM hat einige JIT-Compiler für LLVM IR, aber es ist immer noch Sache des Entwicklers, die Dinge zusammenzufügen und tatsächlich den Code zu JITen.

Wenn die JVM trifft eine nicht aufgelöste externe, geht es aus und findet die richtige Klasse , ihn zu befriedigen, und weiß , wie für .class - Dateien im Dateisystem direkt zu suchen und in .jar - Dateien 1 . Die JIT-Compiler von LLVM haben Hooks, mit denen Sie entscheiden können, wie solche Dinge gehandhabt werden. Wie zu erwarten war , haben einige Leute einige Standard Versionen geschrieben, so dass es kann Dinge tun , etwa in der gleichen Größenordnung wie die JVM kann - aber Sie sind auch frei , diese und tun Dinge anders zu ignorieren , wenn Sie wählen.

Einfach ausgedrückt, wenn Sie einen Compiler (oder etwas in dieser Reihenfolge) entwickeln, verfügt er über zahlreiche Tools, die Ihnen das Leben erleichtern. Anstatt sich große Sorgen um die Optimierung zu machen, können Sie die einfachste Übersetzung, die Sie von Ihrem Quellcode in LLVM IR verwalten können, ausführen und dann die LLVM-Bibliotheken zum Verwalten von Optimierung, JIT, Verknüpfung usw. verwenden. Trotzdem handelt es sich um Bibliotheken Einige wirklich nützliche Funktionen, damit Sie sich nicht mit allen Details befassen müssen, aber sie funktionieren immer noch und Sie schreiben immer noch Code, um sie aufzurufen. Es ist kein fertiges Produkt, sondern nur ein nützliches Werkzeug, um Produkte relativ schnell und einfach herzustellen.


1 Technisch ist nicht alles in die eigentliche JVM integriert. Es gibt an, was normalerweise als primordialer Klassenlader als Teil der eigentlichen JVM bezeichnet wird, und dann gibt es in java.util.ClassLoader angegebene Benutzerklassenlader, die andere Dinge behandeln. Einige Klassenladeprogramme sind standardmäßig enthalten, und wenn Sie dies dringend genug möchten, können Sie diese ergänzen, indem Sie Ihre eigenen definieren.

Jerry Sarg
quelle
12

Es ist auf niedrigem Niveau, da es so konzipiert ist, dass vorhandene oder zukünftige virtuelle Maschinen (die JVM) es als Kern ihrer Implementierung verwenden können.

Sehen Sie es so: Die virtuellen Maschinen von Java und Python sind sehr portabel, da sie in Standard C geschrieben sind und viel von ihren eigenen Bibliotheken abhängen. Die Absicht von LLVM ist es, eine Infrastruktur bereitzustellen, mit der es einfach ist, jede virtuelle Maschine auf eine Plattform zu portieren, die LLVM bereits unterstützt.

LLVM bietet Unterstützung für statische und JIT-Kompilierung und ist so konzipiert, dass es in einem vertrauenswürdigen Betriebssystembereich ausgeführt werden kann. Das bedeutet, dass theoretisch das Ausführen einer virtuellen Maschine auf LLVM viel weniger Arbeit bedeuten und etwas viel schnelleres und effizienteres produzieren sollte. In der Theorie.

Dann sollte LLVM auf niedrigerer Ebene einfacher auf verschiedene Betriebssystem- und Hardwarearchitekturen zu portieren sein.

Es sind große Einsparungen zu erzielen, wenn Sprachimplementierer auf eine einzelne, einfach zu portierende Low-Level-Plattform schreiben können. Die bekanntesten VMs befinden sich in der Mitte zwischen der Sprache, die sie bedienen, und dem Betriebssystem und müssen ihre eigenen Zwischendarstellungen und JITC implementieren.

Apalala
quelle
5

Der Teil "Low Level" des LLVM-Namens bezieht sich auf die Ebene des verwendeten virtuellen Befehlssatzes. Die von LLVM verwendete Zwischensprache (Intermediate Language, IR) entspricht in etwa der Ebene des Maschinencodes, obwohl sie architekturunabhängig und allgemein ist.

Der Bytecode der JVM und der CLR ist dagegen insofern ziemlich hoch, als er Befehle enthält, die sich auf einer höheren Abstraktionsschicht befinden. Sie sind beide objektorientierte Stack-basierte Assemblersprachen. Zum Beispiel hat die JVM die Anweisung invokevirtual, eine Anweisung, die über das spezifische Objektmodell der Java-Sprache Bescheid wissen muss.

Zayenz
quelle
3

Es ist mit Sicherheit niedriger als alle sprachspezifischen VMs und die einheitlichen VMs wie JVM und CLR. Sein Design ist der Darstellung auf niedriger Ebene in GCC (GIMPLE) und ähnlichen Compilern ähnlich. Es gibt keinen Standard-GC, kein bestimmtes High-Level-Typsystem wird erzwungen, es wird keine Ausrichtung angenommen (es muss explizit angegeben werden), Integer- und Floating-Point-Datentypen sind explizit (und plattformabhängig) und die niedrigste Ebene von allen - a Eine anständige Zeigerarithmetik ist verfügbar.

SK-Logik
quelle