Es gibt eine Reihe von Unterschieden zwischen LLVM und "einem normalen Compiler", die ich annehmen, um "gcc" bedeuten:
- LLVM ist für die Analyse ganzer Programme (auch Link-Time-Analyse genannt) konzipiert und kann daher optional Code in "Bitcode" kompilieren, ein Format, das später erneut analysiert werden kann.
- LLVM bietet einen Just-in-Time-Compiler (JIT), so dass er Programme während ihrer Ausführung neu analysieren kann, genau wie die JVM.
- LLVM ist sehr gut konzipiert:
- seine Komponenten sind modular und gut voneinander getrennt,
- es hat 3 Formate für seine Zwischendarstellung (textuell, binär und eine Darstellung im Speicher), die gleichwertig sind,
- seine Zwischendarstellung verwendet die SSA-Form,
- seine Zwischenrepräsentation hat ein Typsystem.
Was Javascript und andere dynamische Sprachen betrifft, so sehen wir ein großes Interesse an LLVM in der Gemeinschaft der dynamischen Sprachen, mit Python- und Ruby-Implementierungen, die es ausprobieren. Allerdings sind diese nicht versuchen, statische Compiler werden. Sie konzentrieren sich auf die Verwendung des JIT. Insbesondere optimieren sie lang laufende ausführbare Dateien mit einem "Mixed-Mode-Interpreter", bei dem sie die Programme zunächst interpretieren und dann zur Laufzeit mit LLVM kompilieren. Ich habe noch keine Javascript-Engine gesehen, die LLVM verwendet, aber wahrscheinlich gibt es eine. Es wird nur nicht erstellen statische ausführbare Dateien, außer unter ungewöhnlichen Umständen, oder für reduzierte Versionen von Javascript.
Was den Grund für die Schaffung von LLVM angeht, so begann sie als Teil von Vikram Adve die Arbeit der Forschungsgruppe über lebenslange Zusammenstellung (d.h. JITs und Link-Time-Optimierung). Nach seiner Promotion wechselte Chris Lattner zu Apple, die das Projekt stark vorantreiben (wahrscheinlich weil es unter BSD-Lizenz steht, was ihnen in der Vergangenheit Probleme mit dem Gcc bereitet hat, der unter der GPL steht).