ubuntuusers.de

llvm und clang

Status: Ungelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

burli

Avatar von burli

Anmeldungsdatum:
27. April 2007

Beiträge: 9066

Wohnort: Petersberg

Ich bin immer noch verwirrt über llvm und clang. Wenn ich jetzt ein C/C++ Programm schreibe, wird das dann zu fertigem Binärcode compiliert wie mit dem GCC oder erst zur Laufzeit wie Java? Oder gibt es beide Möglichkeiten?

Leider findet sich wenig deutsches Material, um erst mal in die Materie einzusteigen. Kann mir das jemand erklären und gibt es deutsche Webseiten mit brauchbaren Tutorials?

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13176

burli schrieb:

Ich bin immer noch verwirrt über llvm und clang. Wenn ich jetzt ein C/C++ Programm schreibe, wird das dann zu fertigem Binärcode compiliert wie mit dem GCC oder erst zur Laufzeit wie Java? Oder gibt es beide Möglichkeiten?

https://de.wikipedia.org/wiki/LLVM#Arbeitsweise

burli

(Themenstarter)
Avatar von burli

Anmeldungsdatum:
27. April 2007

Beiträge: 9066

Wohnort: Petersberg

Der Absatz ist doof geschrieben, finde ich. Hatte das natürlich schon gelesen, aber mir war er trotzdem nicht klar

Trotzdem fehlt mir noch eine Einführung über llvm und clang. Das scheint ja mehr als ein C Compiler zu sein. Ich hab nur keine Ahnung, wofür das alles gut ist

https://github.com/loarabia/Clang-tutorial/blob/master/CItutorial1.cpp

Und es gibt wie gesagt nichts auf deutsch, nicht einmal Bücher

Lysander

Avatar von Lysander

Anmeldungsdatum:
30. Juli 2008

Beiträge: 2669

Wohnort: Hamburg

Eigentlich beschreibt der Absatz doch recht gut, wozu das alles da ist und zeigt einige Möglichkeiten auf.

Wo genau verstehst Du denn Dinge nicht?

Einige wichtige Themen, die hier nicht genannt sind, wären noch:

  • Code Formatierung

  • Kontextsensitive Hilfen und Refactorings für IDEs

Im großen und ganzen kannst Du Dir als Kernstück der LLVM eine "neutrale" Sprache vorstellen. Jede Programmiersprache kann in diese übersetzt werden (Frontend, wie z.B. clang). Die Ausführung oder Erzeugung von lauffähigem Code passiert dann durch die LLVM. Letztlich ähnelt dass dem Ansatz, den die JVM Anfang der 90er Jahre etabliert hat: Anstelle für populäre Sprachen verschiedene Compiler schreiben zu müssen, schreibt man nur einen und baut stattdessen verschiedene Interpreter für die verschiedenen Plattformen. Optimierungen z.B. sind ja oftmals stark von der Prozessorarchitektur abhängig; hat man eine neue Optimierung gefunden, profitieren alle Sprachen davon, die sich in die LLVM Zwischensprache übersetzen lassen.

Weitere Vorteile sind z.B., dass der Sprachendesigner sich auf die Sprache an sich konzentrieren kann, Leute mit Begeisterung für den Kontext Compilerbau sich auf Optimierungsmöglichkeiten bei der Ausführung oder Codeerzeugung aus der Zwischensprache. Hinzu kommen noch Metainformationen der Ursprungssprache, die dafür genutzt werden können, semantische Analysen zu machen, etwa für oben erwähnte Dinge oder auch (sehr modern) statische Codenanalyse oder property based testing.

Ist Dir Vala vertraut? Diese Sprache wird (analog zu anderen, bereits früher benutzten Ansätzen; gerne auch bei den sogenannten esoterischen Programmiersprachen) einfach in C Code kompiliert. Da es für C eine riesige Auswahl an Compilern gibt, die unterschiedlichste Plattformen abdecken, kannst Du also mittels Vala für alle möglichen Systeme Code schreiben. Hätte man so etwas aus dem Boden stampfen wollen, wäre man sicherlich niemals so weit gekommen bzw. letztlich gescheitert, wenn man sich den Markt für Vala anguckt.

Ähnliches ist in den letzten Jahren auch im JavaScript-Umfeld zu beobachten: Neben anfänglich zu JavaScript ähnlichen Sprachen (CoffeeScript etwa) gesellen sich immer mehr Sprachen, die sich nach JS kompilieren lassen und somit im Browser ausführbar werden, etwa Clojure oder Scala als prominente Vertreter, oder natürlich auch Java wie etwa bei GWT.

Als Fan von funktionaler Programmierung muss ich natürlich auch Frege anbringen, welches nach Java kompiliert. Das erleichtert die Interoperabilität mit Java (Du musst Deinem Chef sogar theoretisch gar nicht sagen, dass Du etwas in Frege gemacht hast 😈 ), birgt aber natürlich auch gewisse Nachteile in sich, würde man stattdessen direkt in Java Bytecode übersetzen.

Das LLVM Projekt ist iirc aus der Forschung heraus entwickelt bzw. initiiert worden, um einfach eine gute Plattform für Forschung und Experimente in Sachen Compilerbau zu haben. Daraus hat sich einfach enorm viel entwickelt. Im Gegensatz zu existierenden Lösungen a la JVM oder CLR war die von Anfang an konsequent betriebene Quelloffenheit sicher ein Motivator, zudem sicherlich auch besondere Anforderungen.

burli

(Themenstarter)
Avatar von burli

Anmeldungsdatum:
27. April 2007

Beiträge: 9066

Wohnort: Petersberg

Was llvm ist hab ich einigermaßen verstanden. Eine Compiler Plattform, mit der man mit verschiedenen Frontends unterschiedliche Sprachen in eine Zwischensprache übersetzen kann und dann entweder zu Binärcode compilieren oder in einem Jit ausführen kann.

Was clang genau ist versuche ich aber immer noch zu verstehen. Klar, clang ist ein Compiler für C ähnliche Sprachen. Aber da passiert ja noch mehr. Man kann da irgendwelche Funktionen aus einer riesigen Library mit in das Programm compilieren. Was man da alles machen kann und wozu das alles gut ist hab ich noch nicht verstanden

Antworten |