GNU Compiler Collection

aus Wikipedia, der freien Enzyklopädie
Zur Navigation springen Zur Suche springen
GNU Compiler Collection

Logo von GNU Compiler Collection
Basisdaten

Maintainer Richard Biener[1],Jakub Jelínek[2]
Entwickler GNU-Projekt
Erscheinungsjahr 23. Mai 1987[3]
AktuelleVersion 14.2[4]
(1. August 2024)
Betriebssystem plattformübergreifend
Programmier­sprache C++,C
Kategorie Compiler
Lizenz GNU General Public License, Version 3,GNU Lesser General Public License, Version 2.1
gcc.gnu.org

GCCist der Name derCompiler-Suite desGNU-Projekts.GCCstand ursprünglich fürGNU C Compiler.Da GCC heute aber außerCnoch einige andere Programmiersprachen übersetzen kann, hat GCC inzwischen die BedeutungGNU Compiler Collectionerhalten (englischfürGNU-Compilersammlung). Das Kommandogcc(in Kleinbuchstaben) steht weiterhin für den C-Compiler.

Die Sammlung enthältCompilerfür dieProgrammiersprachenC,C++,Objective-C,D,Fortran,AdaundGo.Sie unterliegt den Bedingungen derGNU General Public License.

GCC wird von einer Reihe von Systemen als Standardcompiler genutzt, darunter vieleLinux-Distributionen,BSD-Varianten,NeXTStep,BeOSundZETA.Zudem bietet er auch Unterstützung für die LaufzeitumgebungCygwinund die EntwicklerwerkzeugeMinGW.[5]Er wurde auf mehr Systeme und Rechnerarchitekturen portiert als jeder andere Compiler und bietet sich insbesondere fürBetriebssystemean, die auf verschiedenenHardwareplattformenlaufen sollen. Der GCC lässt sich auch alsCross-Compilerinstallieren.[6]

2014 erhielt er denProgramming Languages Software Awardvon ACM SIGPLAN.

Die erste öffentliche Version (0.9) des GCC wurde am 22. März 1987 vonRichard Stallman[7][8]für dasGNU-Projektfreigegeben (Version 1.0 erschien am 23. Mai desselben Jahres) und wird heute von Programmierern auf der ganzen Welt weiterentwickelt. Die Erweiterung des C-Compilerpakets zur Compiler-Collection erfolgte im Rahmen des EGCS-Projektes, das eine Weile parallel zum GCC existierte und schließlich zum offiziellen GCC wurde.

1997 spaltete sich das ProjektExperimental/Enhanced GNU Compiler System(EGCS,engl. fürexperimentelles/verbessertes GNU-Compilersystem) von GCC ab, und wurde 1999 mit diesem wieder vereinigt.[9]

GCC 1.x hatte 1991 eine gewisse Stabilität erreicht, jedoch verhinderten architekturbedingte Einschränkungen viele Verbesserungen, sodass dieFree Software Foundation(FSF) damit begann, GCC 2.x zu entwickeln. Mitte der 1990er kontrollierte die FSF jedoch sehr genau, was zu GCC 2.x hinzugefügt werden durfte und was nicht, sodass GCC als Beispiel für das „Cathedral “-Entwicklungsmodell Verwendung fand, dasEric S. Raymondin seinem BuchDie Kathedrale und der Basarbeschreibt.

Da GCC freie Software ist, ist es Programmierern, die in eine andere Richtung arbeiten wollten, erlaubt, eigeneAbspaltungenzu entwickeln. Viele Abspaltungen erwiesen sich jedoch als ineffizient und unübersichtlich. Dass ihre Arbeiten vom offiziellen GCC-Projekt oft nicht, oder nur unter Schwierigkeiten akzeptiert wurden, frustrierte viele Entwickler.

Daher gründete eine Gruppe von Entwicklern 1997 EGCS, um mehrere experimentelle Abspaltungen in einem einzigen Projekt zu vereinen. Dazu gehörten g77 (Fortran), PGCC (Pentium-optimierter GCC), das Einpflegen vieler Verbesserungen an C++, sowie Compiler-Versionen für weitere Prozessor-Architekturen und Betriebssysteme.

Die Entwicklung von EGCS erwies sich als schneller, lebhafter und insgesamt besser als die des GCC-Projektes, sodass die FSF 1999 offiziell die Weiterentwicklung von GCC 2.x einstellte und stattdessen EGCS als offizielle GCC-Version übernahm. Die EGCS-Entwickler wurden zu Projektverantwortlichen (engl.maintainer) des GCC. Von da an wurde das Projekt explizit nach dem „Basar “-Modell entwickelt, nicht mehr nach dem „Cathedral “-Modell. Mit der Veröffentlichung von GCC 2.95 im Juli 1999 waren beide Projekte wiedervereinigt.

GCC 4.1.3 in einemKommandozeilen-Fenster unterUbuntu7.10 mitGnome2.20

Das GCC-Projekt bezeichnet einige Plattformen offiziell als primäre und andere als sekundäre Evaluationsplattformen. Vor jeder Veröffentlichung einer neuen Version werden insbesondere diese beiden Gruppen getestet. GCC kann Programme für folgende Befehlssatzarchitekturen erzeugen (primäre und sekundäre Evaluationsplattformen sind markiert):

Dazu kommt noch eine Reihe von Architekturen von Prozessoren füreingebettete Systeme,wie

Nicht Bestandteil des offiziellen GCC, aber davon abgeleitet und kommerziell vertrieben gibt es Derivate für

  • AtmelAVR32
  • InfineonC167
  • InfineonTriCore
  • MicrochipPIC24, dsPIC (nur in C) und PIC32 (auch in C++)

Insgesamt unterstützt der GCC mehr als 60 Plattformen.[10]

Design Flow von GCC

Das externe Interface des gcc entspricht dem eines Standard-Unix-Compilers.

  1. Der Benutzer ruft ein Hauptprogramm mit dem Namengccauf.
  2. GCC interpretiert das Kommandozeilen-Argument.
  3. GCC stellt die Programmiersprache der vorliegenden Eingabedatei fest.
  4. Der entsprechende Sprach-Compilerwird aufgerufen.
  5. Die Ausgabe wird demAssemblerübergeben.
  6. Schließlich wird derLinkeraufgerufen.
  7. Ein vollständiges, d. h. lauffähigesProgrammwurde erstellt.

Jeder Sprachcompiler ist ein separates Programm, das Quellcode entgegennimmt und Assemblersprache produziert. Im abgebildeten Schema sind Beispiele für C und Assembler gegeben, welche sich beide demPreprocessingunterziehen müssen, bei dem Compilermakros,eingebundeneHeader-Dateienund Ähnliches umgewandelt werden, um reinen C-Code bzw. Assembler zu erhalten. Jenes sprachabhängigeFrontendparstdie entsprechende Sprache und erzeugt einenabstraktenSyntaxbaum,der an einBackendübergeben wird, das den Baum in GCCsRegister Transfer Language(RTL)überführt (im Diagramm nicht gezeigt), verschiedeneCodeoptimierungendurchführt und zum SchlussAssemblerspracheerzeugt.

Ursprünglich wurden die meisten Bestandteile der GCC in C geschrieben. Im Rahmen des Vorhabens „GCC in Cxx “[11]wurde 2010 die Umstellungen der gcc-Quellen auf C++ geplant und begonnen. Ziel dieser Umstellung ist, die GCC verständlich und wartbar zu halten. Im Nachfolgeprojekt[12]wurde auch die noch fehlende Stufe 1 des GCC-Bauprozesses auf C++-Code umgestellt.[13]Ausnahmen sind Backends, die in wesentlichen Teilen in RTL formuliert sind, sowie das Ada-Frontend, welches zum größten Teil in Ada geschrieben ist.

Frontends müssen Bäume produzieren, die vom Backend verarbeitet werden können. Wie sie dies erreichen, bleibt ihnen überlassen. EinigeParserbenutzenYacc-ähnliche Grammatiken, andere verwenden handgeschriebene, rekursive Parser.

Mit dem Tree-SSA-Projekt, das in die Version GCC 4.0 integriert wurde, wurden zwei neue Formen von sprachunabhängigen Bäumen eingeführt. Diese neuen Baumformate wurdenGENERICundGIMPLEgetauft. Parsing wird nun durchgeführt, indem ein temporärer sprachabhängiger Baum nach GENERIC konvertiert wird. Der sogenannte „Gimplifier “überführt diese komplexe Form in die SSA-basierte GIMPLE-Form, von der ausgehend eine Reihe neuer sprach- und architekturunabhängiger Optimierungen durchgeführt werden kann.

Optimierung an Bäumen passt eigentlich nicht in das Schema von „Frontend “und „Backend “, da sie nicht sprachabhängig sind und kein Parsen beinhalten. Die GCC-Entwickler haben diesem Teil des Compilers daher den Namen „Middleend “gegeben. Zu den gegenwärtig am SSA-Baum durchgeführten Optimierungen gehörenDead code elimination,Partial Redundancy Elimination,Global Value Numbering,Sparse Conditional Constant Propagation,Scalar replacement of AggregatesundArray-basierende Optimierungen, wie automatischeVektorisierung.[14]

Das Verhalten des GCC-Backends wird teilweise durch Präprozessor-Makros und architekturspezifische Funktionen bestimmt, mit denen zum Beispiel dieEndianness,Wortgröße, und Aufrufkonventionen definiert und die Registerstruktur der Zielmaschine beschrieben werden. Unter Verwendung der Maschinenbeschreibung, einerLisp-ähnlichen Beschreibungssprache, wandelt GCC die interne Baumstruktur in die RTL-Darstellung um. Obwohl diese dem Namen nach prozessorunabhängig ist, ist die Sequenz an abstrakten Instruktionen daher bereits an das Ziel angepasst.

Die Art und Anzahl der vom GCC an der RTL durchgeführten Optimierungen werden mit jeder Compiler-Version weiterentwickelt. Zu ihnen gehören etwa(global)common subexpression elimination,verschiedene Schleifen- und Sprungoptimierungen (englischif-conversion, branch probability estimation, sibling calls, constant propagation,...) sowie dercombine-pass,in dem mehrere Instruktionen zu einer einzigen kombiniert werden können.

Seit der Einführung von globalen SSA-basierten Optimierungen an GIMPLE-Bäumen haben die RTL-Optimierungen leicht an Bedeutung verloren, da in der RTL-Repräsentation des Programms weit weniger der für viele Optimierungen wichtigen High-Level-Informationen enthalten sind. Allerdings sind auch maschinenabhängige Optimierungen sehr wichtig, da für viele Optimierungen Informationen über die Maschine vorliegen müssen, etwa darüber, welche Instruktionen eine Maschine kennt, wie teuer diese sind und wie diePipelineder Zielarchitektur beschaffen ist.

In der „Reload “-Phase wird die prinzipiell unbeschränkte Anzahl an abstrakten Pseudo-Registerndurch die begrenzte Anzahl an echten Maschinenregistern ersetzt, wobei hier unter Umständen neue Instruktionen in den Code eingefügt werden müssen, um zum Beispiel Pseudo-Register auf demStackder Funktion zwischenzuspeichern. DieseRegisterzuteilungist recht kompliziert, da die verschiedenen Eigenheiten der jeweiligen Zielarchitektur besonders berücksichtigt werden müssen.

In der letzten Phase werden Optimierungen durchgeführt, wiepeephole optimizationunddelay slot scheduling,bevor die recht maschinennahe Ausprägung der RTL auf Assemblercode abgebildet wird, indem die Namen von Registern und Adressen in Zeichenketten umgesetzt werden, welche die Instruktionen spezifizieren.

  1. gcc.gnu.org.(abgerufen am 27. Mai 2022).
  2. github.
  3. gnu.org.
  4. Jakub Jelínek:GCC 14.2 Released.1. August 2024 (abgerufen am 1. August 2024).
  5. Jens Ihlenfeld:Compiler GCC 4.5.1 veröffentlicht.golem.de, 2. August 2010,abgerufen am 27. April 2015.
  6. Nikolaus Schüler:Der Gcc-Compiler – Überblick und Bedienung.1. Auflage. bhv, Kaarst 1997, S. 28.ISBN 3-89360-873-7
  7. GNU C compiler beta test release– Nachricht beiGoogle Groups,vom 22. März 1987, abgerufen am 1. März 2017 (englisch).
  8. Alexander Neumann:GCC 4.7 und 25 Jahre GNU Compiler Collection.heise.de, 22. März 2012,abgerufen am 24. März 2012.
  9. GCC FAQ: What is the relationship between GCC and EGCS?In:gnu.ist.utl.pt.21. Juni 2006,abgerufen am 2. Juni 2022(englisch).
  10. Host/Target specific installation notes for GCC.In:gnu.org,23. Februar 2006 (englisch).
  11. THE GCC Wiki - gcc-in-cxx.In:gcc.gnu.org.Gnu Org, 6. April 2012,abgerufen am 4. Mai 2022(englisch).
  12. cxx-conversion - GCC Wiki.In:gcc.gnu.org.11. Dezember 2012,abgerufen am 4. Mai 2022(englisch).
  13. Thorsten Leemhuis:GCC setzt intern verstärkt auf C++.heise.de, 16. August 2012,abgerufen am 26. April 2015.
  14. Auto-vectorization in GCC.gcc.gnu.org, abgerufen am 25. Juli 2021 (englisch).
Commons:GNU Compiler Collection– Album mit Bildern, Videos und Audiodateien