Frage

Ich habe aufgeregt über LLVM ist niedrig genug, um jedes System zu modellieren, und sah es als viel versprechend, dass Apple wurde die Annahme; aber dann wieder Apple nicht speziell unterstützt Haskell ;

Und, denken einige, dass Haskell wäre besser dran mit C-- :

  

Das LLVM'ers nicht das Problem der Null-Overhead Garbage Collection gelöst haben   ist nicht allzu überraschend.   Die Lösung dieses während ihres Aufenthalt des Datenmodelles Agnostiker von   ist eine offene Frage in der Informatik.

- LHC wird nicht mit LLVM werden.

War es hilfreich?

Lösung

Nun, es ist ein Projekt, bei UNSW GHC Core LLVM zu übersetzen

Denken Sie daran: es war nicht klar, vor 10 Jahren, dass LLVM würde die gesamte Infrastruktur C--, war nicht in der Lage aufzubauen. Leider hat LLVM die Infrastruktur für tragbare, optimierten Code, aber nicht die Infrastruktur für die schöne Hochsprachenunterstützung, dass C-- ha (n) d.

Ein interessantes Projekt wäre LLVM Ziel von C-- ...


Update , wie von GHC 7,

Andere Tipps

Mit arbeitete ein wenig mit dem neuen Code-Generierung Backend, die C-- manipuliert, kann ich sagen, dass es eine Reihe von Gründen, warum C-- besser als LLVM sein kann, und warum auch wirklich sie sind nicht alle gleich Sache.

  1. C-- arbeitet auf einer höheren Abstraktionsebene als LLVM; zum Beispiel können wir Code in C-- erzeugen, in dem der Stapelzeiger vollständig implizit ist, und es erst später während des Übersetzungsvorgangs manifestieren. Dies macht die Anwendung bestimmter Arten von Optimierungen viel einfacher, weil die höhere Darstellung für mehr Kodeverschiebung mit weniger Invarianten ermöglicht.

  2. Während wir aktiv, dies zu beheben suchen, LLVM aus dem gleichen Problem leidet, dass die über-C-Backend gelitten. Es erfordert, dass wir proc Punkte erstellen Was sind proc Punkte? Im Wesentlichen, weil Haskell nicht die klassische Call / ret Aufrufkonvention verwenden, wenn wir die moralische Äquivalent eines Sub-Prozedur Anruf zu tätigen, müssen wir eine Fortsetzung auf den Stapel schieben und dann auf die Sub-Prozedur springen. Diese Fortsetzung ist in der Regel ein lokales Label, sondern LLVM erfordert es ein tatsächliches Verfahren sein, also müssen wir Funktionen in kleinere Stücke brechen (jedes Stück einen proc Punkt genannt werden). Dies ist eine schlechte Nachricht für Optimierungen, die auf einer Prozedur-Ebene arbeiten.

  3. C-- und LLVM nimmt einen anderen Ansatz zur Datenfluß-Optimierung. LLVM verwendet traditionelle SSA Stil mit phi-Knoten: C-- einen kühlen Framework verwendet Hoopl genannt, die Sie nicht benötigen die SSA unveränderlich zu halten. Ich kann bestätigen:. Programmieren Optimierungen in Hoopl ist eine Menge Spaß, wenn bestimmte Arten von Optimierungen (inlining Einmal verwendete Variablen in dem Sinne kommt) sind nicht gerade die natürlichste in dieser Datenfluß Einstellung

Ein Problem in der Praxis ist LLVM war viel mehr ein sich bewegendes Ziel.

GHC hat einige Probleme hat versucht, mehrere Versionen von LLVM zu unterstützen. Es gibt eine aktive Diskussion auf dem GHC-dev Mailing Liste darüber.

Btw, die derzeit die llvm Backend in ghc ist nach der Haskell zur cmm Sprache übersetzt wird (was ich glaube ist meist nur mit bestimmten Registern aus der STG Sprache erweitert c--) und aufgrund des oben zu be- Schwierigkeiten angesprochen, gibt es redundant Optimierungen durchgeführt, welche die Erstellung verlangsamt.

Auch historisch und gegenwärtig AFAIK, wird das LLVM Projekt priorisieren nicht eine tragbare Plattform bereitstellt, und einige Entwickler haben einen Punkt zu artikulieren, dass es ist eine IR-Compiler und nicht eine Form von tragbarer Assemblersprache .

Die LLVM IR schreiben Sie für ein Bestimmungsgemäße Ziel kann nicht nützlich sein für ein anderes beabsichtigtes Ziel. Zum Vergleich verweist die C-- Website tatsächlich auf sie als tragbare Montage. „Sie wäre viel glücklicher mit einem tragbaren Assemblersprache, die ... sein könnte“ ist ein Zitat von rel="nofollow">. Das Website erwähnt auch eine Runtime-Schnittstelle portable Implementierung von Müllabfuhr und die Ausnahmebehandlung zu erleichtern.

So könnte man denken C-- als tragbare gemeinsame Grundlage für alle von den vorderen Enden, die für alle Ihre Backends ein wenig mehr gemeinsam mit CIL und Java-Bytecode und LLVM IR als Ausdruck Common-Boden hat, dass erleichtert die vereinheitlichende Low-Level-Optimierungen gemeinsam mehrere Ziele. LLVM IR bietet auch den zusätzlichen Bonus, dass die LLVM-Projekt eine Menge dieser niedrigen Niveau Optimierung umsetzen. Davon abgesehen, ist in gewisser Weise LLVM IR tatsächlich höhere Ebene in Betracht gezogen werden könnte, als C--, zum Beispiel LLVM IR verschiedene Typen hat, wo wie in C-- alles nur Vektoren biß.

scroll top