Klingeln - Clang

Klingeln
LLVM Neues Logo.png
Clang 12.0.1 Versionsinformationen screenshot.png
Klang 12.0.1
Originalautor(en) Chris Lattner
Entwickler LLVM-Entwicklergruppe
Erstveröffentlichung 26. September 2007 ; Vor 14 Jahren ( 2007-09-26 )
Stabile Version
13.0.0 / 4. Oktober 2021 ; Vor 12 Tagen ( 2021-10-04 )
Vorschauversion
13.0.0-rc2 / 27. August 2021 ; Vor 50 Tagen ( 2021-08-27 )
Repository
Geschrieben in C++
Betriebssystem Unix-ähnlich
Plattform AArch64 , ARMv7 , IA-32 , x86-64 , ppc64le
Typ Compiler-Frontend
Lizenz Apache-Lizenz 2.0 mit LLVM-Ausnahmen
Webseite Klirren .llvm .org

Klirren / k l æ ŋ / ist ein Compiler Frontend für die C , C ++ , Objective-C und Objective-C ++ Programmiersprachen sowie die OpenMP , OpenCL , render , CUDA und HIP - Frameworks. Es fungiert als Drop-In-Ersatz für die GNU Compiler Collection (GCC) und unterstützt die meisten ihrer Kompilierungs-Flags und inoffiziellen Spracherweiterungen. Es enthält einen statischen Analysator und mehrere Codeanalysetools.

Clang arbeitet zusammen mit dem LLVM- Compiler-Backend und war ein Unterprojekt von LLVM 2.6 und höher. Wie bei LLVM handelt es sich um kostenlose Open-Source-Software unter der Softwarelizenz Apache License 2.0 . Zu seinen Mitwirkenden zählen Apple , Microsoft , Google , ARM , Sony , Intel und AMD .

Clang 12, die neueste Hauptversion von Clang (Stand April 2021), bietet volle Unterstützung für alle veröffentlichten C++-Standards bis C++17 , implementiert die meisten Funktionen von C++20 und bietet erste Unterstützung für den kommenden C++23- Standard . Seit v6.0.0 kompiliert Clang C++ standardmäßig mit dem GNU++14-Dialekt, der Funktionen des C++14- Standards und konforme GNU-Erweiterungen enthält.

Hintergrund

Ab 2005 begann Apple Inc. mit der umfassenden Nutzung von LLVM in mehreren kommerziellen Produkten, darunter das iOS SDK und Xcode 3.1. Eine der ersten Anwendungen von LLVM war ein OpenGL- Code-Compiler für OS X , der OpenGL-Aufrufe in grundlegendere Aufrufe für Grafikprozessoren (GPU) umwandelt , die bestimmte Funktionen nicht unterstützen. Dies ermöglichte es Apple, OpenGL auf Computern mit Intel GMA- Chipsätzen zu unterstützen und die Leistung auf diesen Computern zu erhöhen.

Das LLVM-Projekt beabsichtigte ursprünglich, das Frontend von GCC zu verwenden . Der GCC-Quellcode ist jedoch umfangreich und etwas umständlich; wie ein langjähriger GCC-Entwickler es in Bezug auf LLVM ausdrückte: "Der Versuch, das Nilpferd zum Tanzen zu bringen, macht nicht wirklich viel Spaß". Außerdem verwendet Apple-Software Objective-C , was für GCC-Entwickler eine geringe Priorität hat. Daher lässt sich GCC nicht reibungslos in die integrierte Entwicklungsumgebung (IDE) von Apple integrieren . Schließlich verlangt die GCC-Lizenzvereinbarung, die GNU General Public License (GPL) Version 3 , von Entwicklern, die Erweiterungen oder modifizierte Versionen von GCC vertreiben, ihren Quellcode zur Verfügung zu stellen, aber die freizügige Softwarelizenz von LLVM ist frei von solchen Hindernissen.

Am Ende entschied sich Apple für die Entwicklung von Clang, einem neuen Compiler-Frontend, das C, Objective-C und C++ unterstützt. Im Juli 2007 erhielt das Projekt die Genehmigung, Open Source zu werden.

Entwurf

Clang arbeitet mit LLVM zusammen. Die Kombination von Clang und LLVM stellt den größten Teil der Toolchain zum Ersetzen des GCC- Stacks bereit . Eines der Hauptziele von Clang ist die Bereitstellung einer bibliotheksbasierten Architektur, damit der Compiler mit anderen Tools zusammenarbeiten kann, die mit Quellcode interagieren, wie beispielsweise integrierten Entwicklungsumgebungen (IDE). Im Gegensatz dazu arbeitet GCC in einem compile- Link - Debug - Workflow; Die Integration mit anderen Tools ist nicht immer einfach. GCC verwendet beispielsweise einen Schritt namens fold , der für den gesamten Kompilierungsprozess von entscheidender Bedeutung ist, der den Nebeneffekt hat, dass der Codebaum in eine Form übersetzt wird, die sich vom ursprünglichen Quellcode unterscheidet. Wenn während oder nach dem Faltschritt ein Fehler gefunden wird, kann es schwierig sein, diesen wieder an eine Stelle in der Originalquelle zu übersetzen. Außerdem müssen Anbieter, die den GCC-Stack innerhalb von IDEs verwenden, separate Tools verwenden, um den Code zu indizieren, um Funktionen wie Syntaxhervorhebung und intelligente Codevervollständigung bereitzustellen .

Clang behält während des Kompilierungsprozesses mehr Informationen als GCC und behält die Gesamtform des ursprünglichen Codes bei, wodurch es einfacher wird, Fehler wieder in die ursprüngliche Quelle zuzuordnen. Die Fehlerberichte von Clang sind detaillierter, spezifischer und maschinenlesbar, sodass IDEs die Ausgabe des Compilers indizieren können. Der modulare Aufbau des Compilers kann Quellcodeindizierung, Syntaxprüfung und andere Funktionen bieten, die normalerweise mit schnellen Anwendungsentwicklungssystemen verbunden sind. Der Parse-Baum eignet sich auch besser zur Unterstützung des automatisierten Code-Refactorings , da er direkt den ursprünglichen Quellcode darstellt.

Clang kompiliert nur C-ähnliche Sprachen wie C, C++, Objective-C und Objective-C++. In vielen Fällen kann Clang GCC bei Bedarf ersetzen, ohne dass sich andere Auswirkungen auf die Toolchain als Ganzes ergeben. Es unterstützt die meisten der am häufigsten verwendeten GCC-Optionen. Das Flang- Projekt von Nvidia und The Portland Group fügt Fortran- Unterstützung hinzu. Für andere Sprachen wie Ada bleibt LLVM jedoch abhängig von GCC oder einem anderen Compiler-Frontend.

Leistung und GCC-Kompatibilität

Clang ist mit GCC kompatibel. Seine Befehlszeilenschnittstelle teilt viele Flags und Optionen von GCC . Clang implementiert viele GNU-Spracherweiterungen und Compiler-Intrinsics, von denen einige nur der Kompatibilität dienen. Obwohl Clang beispielsweise atomare Intrinsic- Elemente implementiert, die genau mit C11- Atomics übereinstimmen , implementiert es auch die __sync_*Intrinsic- Elemente von GCC aus Gründen der Kompatibilität mit GCC und libstdc++ . Clang behält auch die ABI- Kompatibilität mit GCC-generiertem Objektcode bei . In der Praxis ist Clang ein Drop-In-Ersatz für GCC.

Die Entwickler von Clang wollen den Speicherbedarf reduzieren und die Kompilierungsgeschwindigkeit im Vergleich zu konkurrierenden Compilern wie GCC erhöhen. Im Oktober 2007 berichteten sie, dass Clang die Carbon- Bibliotheken mehr als doppelt so schnell kompilierte wie GCC, während sie etwa ein Sechstel des Arbeitsspeichers und des Festplattenplatzes von GCC beanspruchte. Bis 2011 scheint Clang diesen Vorteil bei der Compilerleistung beizubehalten. Ab Mitte 2014 kompiliert Clang immer noch durchweg schneller als GCC in einem gemischten Benchmark für Kompilierungszeit und Programmleistung. Bis 2019 ist Clang jedoch beim Kompilieren des Linux-Kernels deutlich langsamer als GCC, während es beim Kompilieren von LLVM etwas schneller bleibt.

Während Clang in der Vergangenheit beim Kompilieren schneller war als GCC, hinkte die Ausgabequalität hinterher. Ab 2014 blieb die Leistung von Clang-kompilierten Programmen hinter der Leistung des GCC-kompilierten Programms zurück, manchmal um große Faktoren (bis zu 5,5x), was frühere Berichte über eine langsamere Leistung replizierte. Beide Compiler haben sich seitdem weiterentwickelt, um ihre Leistung zu steigern, wobei sich die Lücke verringert:

  • Vergleiche im November 2016 zwischen GCC 4.8.2 und clang 3.4 anhand einer großen Anzahl von Testdateien zeigen, dass GCC bei gut optimiertem Quellcode um ca. 17 % übertrifft. Testergebnisse sind codespezifisch, und nicht optimierter C-Quellcode kann solche Unterschiede umkehren. Die beiden Compiler erscheinen daher weitgehend vergleichbar.
  • Vergleiche im Jahr 2019 auf Intel Ice Lake haben gezeigt, dass von Clang 10 generierte Programme 96% der Leistung von GCC 10 in 41 verschiedenen Benchmarks erreicht haben (wobei sie 22 gewonnen und 19 davon verloren haben).

Im Jahr 2021 wurde ein Benchmark erstellt, um die Leistung und die Kompilierungszeiten von LLVM 2.7 mit LLVM 11 zu vergleichen. Die Schlussfolgerung war, dass LLVM 11 mit Optimierungen zum Kompilieren von Code tendenziell 2x länger braucht und daher Code erzeugt, der 10-20% schneller läuft (mit gelegentlichen Ausreißern in beide Richtungen), verglichen mit LLVM 2.7, das mehr als 10 Jahre alt ist.

Statusverlauf

Diese Tabelle zeigt nur bedeutende Schritte und Releases in der Geschichte von Clang.

Datum Höhepunkte
11. Juli 2007 Clang-Frontend unter Open-Source-Lizenz veröffentlicht
25. Februar 2009 Clang/LLVM kann einen funktionierenden FreeBSD- Kernel kompilieren .
16. März 2009 Clang/LLVM kann einen funktionierenden DragonFly-BSD- Kernel kompilieren .
23. Oktober 2009 Clang 1.0 veröffentlicht, erstmals mit LLVM 2.6.
Dezember 2009 Codegenerierung für C und Objective-C erreichen Produktionsqualität. Unterstützung für C++ und Objective-C++ noch unvollständig. Clang C++ kann GCC 4.2 libstdc++ parsen und Arbeitscode für nicht-triviale Programme generieren und sich selbst kompilieren.
2. Februar 2010 Clang -Selbsthosting .
20. Mai 2010 Die neueste Version von Clang hat die Boost C++-Bibliotheken erfolgreich erstellt und fast alle Tests bestanden.
10. Juni 2010 Clang/LLVM wird integraler Bestandteil von FreeBSD , aber der Standard-Compiler ist immer noch GCC.
25. Oktober 2010 Clang/LLVM kann einen funktionierenden modifizierten Linux-Kernel kompilieren .
Januar 2011 Vorarbeiten zur Unterstützung des Entwurfs des C++0x- Standards abgeschlossen, wobei einige der neuen Funktionen des Entwurfs in der Clang-Entwicklungsversion unterstützt werden.
10. Februar 2011 Clang kann eine funktionierende HotSpot Java Virtual Machine kompilieren .
19. Januar 2012 Clang wird eine optionale Komponente im plattformübergreifenden NetBSD -Build-System, aber GCC ist immer noch Standard.
29. Februar 2012 Clang 3.0 kann 91,2% des Debian- Archivs neu aufbauen .
29. Februar 2012 Clang wird zum Standard-Compiler in MINIX 3
12. Mai 2012 Clang/LLVM hat angekündigt, GCC in FreeBSD zu ersetzen .
5. November 2012 Clang wird zum Standard-Compiler in FreeBSD 10.x auf amd64/i386.
18. Februar 2013 Clang/LLVM kann einen funktionierenden modifizierten Android- Linux-Kernel für Nexus 7 kompilieren .
19. April 2013 Clang ist die vollständige C++11- Funktion.
6. November 2013 Clang ist das C++14- Feature komplett.
11. September 2014 Clang 3.5 kann 94,3% des Debian-Archivs neu aufbauen. Der Prozentsatz der Fehler ist seit Januar 2013 um 1,2 % pro Release gesunken, hauptsächlich aufgrund der erhöhten Kompatibilität mit GCC-Flags.
Oktober 2016 Clang wird zum Standard-Compiler für Android (und später nur noch Compiler, der von Android NDK unterstützt wird ).
13. März 2017 Clang 4.0.0 veröffentlicht
26. Juli 2017 Clang wird zum Standard-Compiler in OpenBSD 6.2 auf amd64/i386.
7. September 2017 Clang 5.0.0 veröffentlicht
19. Januar 2018 Clang wird zum Standard-Compiler in OpenBSD 6.3 on arm.
5. März 2018 Clang wird jetzt verwendet, um Google Chrome für Windows zu erstellen .
8. März 2018 Clang 6.0.0 veröffentlicht
5. September 2018 Clang wird jetzt verwendet, um Firefox für Windows zu erstellen .
19. September 2018 Clang 7.0.0 veröffentlicht
20. März 2019 Clang 8.0.0 veröffentlicht
1. Juli 2019 Clang wird zum Standard-Compiler in OpenBSD 6.6 auf mips64.
19. September 2019 Clang 9.0.0 freigegeben mit offiziellen RISC-V Ziel zu unterstützen.
29. Februar 2020 Clang wird der einzige C-Compiler im FreeBSD- Basissystem, mit der Entfernung von GCC .
24. März 2020 Clang 10.0.0 veröffentlicht
2. April 2020 Clang wird in OpenBSD 6.7 auf Powerpc zum Standard-Compiler .
12. Oktober 2020 Clang 11.0.0 veröffentlicht
21. Dezember 2020 Clang wird zum Standard-Compiler in OpenBSD 6.9 auf mips64el.
14. April 2021 Clang 12.0.0 veröffentlicht

Siehe auch

Verweise

Externe Links