„GNU Compiler Collection“ – Versionsunterschied
[gesichtete Version] | [gesichtete Version] |
Bot: 2 Weblinks wurden korrigiert |
K stil |
||
Zeile 7: | Zeile 7: | ||
| AktuelleVersion = <!-- Wikidata --> |
| AktuelleVersion = <!-- Wikidata --> |
||
| AktuelleVersionFreigabeDatum = <!-- Wikidata --> |
| AktuelleVersionFreigabeDatum = <!-- Wikidata --> |
||
| Betriebssystem = [[Unix]], [[Linux|GNU/Linux]], [[Microsoft Windows|Windows]], [[ |
| Betriebssystem = [[Unix]], [[Linux|GNU/Linux]], [[Microsoft Windows|Windows]], [[macOS]], und andere |
||
| Kategorie = [[Compiler]] |
| Kategorie = [[Compiler]] |
||
| Lizenz = [[GNU General Public License|GPL]] ([[Freie Software]]) |
| Lizenz = [[GNU General Public License|GPL]] ([[Freie Software]]) |
||
Zeile 22: | Zeile 22: | ||
== Geschichte == |
== Geschichte == |
||
Die erste öffentliche Version (0.9) des GCC wurde am 22. März 1987 von [[Richard Stallman]]<ref>[http://groups.google.com/group/mod.compilers/msg/1b3f30d88eab88f8?pli=1 GNU C compiler beta test release] – Nachricht bei ''[[Google Groups]]'', vom 22. März 1987, abgerufen am 24. März 2012 (englisch).</ref><ref>{{Internetquelle | url= https://www.heise.de/newsticker/meldung/GCC-4-7-und-25-Jahre-GNU-Compiler-Collection-1478304.html | titel= GCC 4.7 und 25 Jahre GNU Compiler Collection | autor = Alexander Neumann | hrsg=heise.de | datum=2012-03-22 | zugriff=2012-03-24 |sprache=}}</ref> für das [[GNU-Projekt |
Die erste öffentliche Version (0.9) des GCC wurde am 22. März 1987 von [[Richard Stallman]]<ref>[http://groups.google.com/group/mod.compilers/msg/1b3f30d88eab88f8?pli=1 GNU C compiler beta test release] – Nachricht bei ''[[Google Groups]]'', vom 22. März 1987, abgerufen am 24. März 2012 (englisch).</ref><ref>{{Internetquelle | url= https://www.heise.de/newsticker/meldung/GCC-4-7-und-25-Jahre-GNU-Compiler-Collection-1478304.html | titel= GCC 4.7 und 25 Jahre GNU Compiler Collection | autor = Alexander Neumann | hrsg=heise.de | datum=2012-03-22 | zugriff=2012-03-24 |sprache=}}</ref> für das [[GNU-Projekt]] freigegeben (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. |
||
=== EGCS === |
=== EGCS === |
||
Zeile 36: | Zeile 36: | ||
== Zielsysteme == |
== Zielsysteme == |
||
[[Datei:GCC 4.1.3 ubuntu7.10 de.png|mini|GCC 4.1.3 in einem ''[[Kommandozeile]]n''-Fenster unter [[Ubuntu]] 7.10 mit [[ |
[[Datei:GCC 4.1.3 ubuntu7.10 de.png|mini|GCC 4.1.3 in einem ''[[Kommandozeile]]n''-Fenster unter [[Ubuntu]] 7.10 mit [[Gnome]] 2.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 Prozessoren erzeugen (primäre und sekundäre Evaluationsplattformen sind markiert): |
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 Prozessoren erzeugen (primäre und sekundäre Evaluationsplattformen sind markiert): |
||
Zeile 43: | Zeile 43: | ||
* [[Hitachi H8|H8/300]] |
* [[Hitachi H8|H8/300]] |
||
* [[S/370]], [[S/390]] |
* [[S/370]], [[S/390]] |
||
* [[X86-Prozessor|i386]] und [[AMD64]] |
* [[X86-Prozessor|i386]] und [[AMD64]] |
||
* [[IA-64]] „Itanium“ |
* [[IA-64]] „Itanium“ |
||
* [[Motorola 68000]] und [[Motorola Coldfire]] |
* [[Motorola 68000]] und [[Motorola Coldfire]] |
||
Zeile 55: | Zeile 55: | ||
* [[VAX]] |
* [[VAX]] |
||
Dazu kommt noch eine Reihe von Prozessoren von [[Eingebettetes System|eingebetteten Systemen]], wie |
Dazu kommt noch eine Reihe von Prozessoren von [[Eingebettetes System|eingebetteten Systemen]], wie |
||
* Motorola [[68HC11]] |
* Motorola [[68HC11]] |
||
* A29K |
* A29K |
||
Zeile 84: | Zeile 84: | ||
* Xtensa |
* Xtensa |
||
Nicht Bestandteil des offiziellen GCC, aber davon abgeleitet und kommerziell vertrieben gibt es Derivate für |
Nicht Bestandteil des offiziellen GCC, aber davon abgeleitet und kommerziell vertrieben gibt es Derivate für |
||
* [[C167]] |
* [[C167]] |
||
Zeile 102: | Zeile 102: | ||
# Ein vollständiges, d. h. lauffähiges [[Computerprogramm|Programm]] wurde erstellt. |
# Ein vollständiges, d. h. lauffähiges [[Computerprogramm|Programm]] wurde erstellt. |
||
Jeder Sprachcompiler ist ein separates Programm, das Quellcode entgegennimmt und Assemblersprache produziert. Im Schema auf der rechten Seite sind Beispiele für C und Assembler gegeben, welche sich beide dem [[Präprozessor|Preprocessing]] unterziehen müssen, bei dem Compiler[[makro]]s, eingebundene [[Header-Datei]]en und Ähnliches umgewandelt werden, um reinen C-Code bzw. Assembler zu erhalten. Jenes sprachabhängige [[Frontend]] [[Parser|parst]] die entsprechende Sprache und erzeugt einen [[Abstrakter Syntaxbaum|abstrakten]] [[Syntaxbaum]], der an ein [[ |
Jeder Sprachcompiler ist ein separates Programm, das Quellcode entgegennimmt und Assemblersprache produziert. Im Schema auf der rechten Seite sind Beispiele für C und Assembler gegeben, welche sich beide dem [[Präprozessor|Preprocessing]] unterziehen müssen, bei dem Compiler[[makro]]s, eingebundene [[Header-Datei]]en und Ähnliches umgewandelt werden, um reinen C-Code bzw. Assembler zu erhalten. Jenes sprachabhängige [[Frontend]] [[Parser|parst]] die entsprechende Sprache und erzeugt einen [[Abstrakter Syntaxbaum|abstrakten]] [[Syntaxbaum]], der an ein [[Front-End und Back-End|Backend]] übergeben wird, das den Baum in GCCs ''{{lang|en|Register Transfer Language}} (RTL)'' überführt (im Diagramm nicht gezeigt), verschiedene [[Compiler#Programmoptimierung (ausführlich)|Codeoptimierungen]] durchführt und zum Schluss [[Assemblersprache]] erzeugt. |
||
Ursprünglich wurden die meisten Bestandteile der GCC in C geschrieben. Im Rahmen des Vorhabens „GCC in Cxx“<ref>http://gcc.gnu.org/wiki/gcc-in-cxx</ref> 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<ref>[http://gcc.gnu.org/wiki/cxx-conversion Cxx conversion]</ref> wurde auch die noch fehlende Stufe 1 des GCC-Bauprozesses auf C++-Code umgestellt.<ref>{{Internetquelle | url= https://www.heise.de/newsticker/meldung/GCC-setzt-intern-verstaerkt-auf-C-1668224.html | titel= GCC setzt intern verstärkt auf C++ | autor = Thorsten Leemhuis | hrsg=heise.de | datum=2012-08-16 | zugriff=2015-04-26 |sprache=}}</ref> Ausnahmen sind Backends, die in wesentlichen Teilen in RTL formuliert sind, sowie das Ada-Frontend, welches zum größten Teil in Ada geschrieben ist. |
Ursprünglich wurden die meisten Bestandteile der GCC in C geschrieben. Im Rahmen des Vorhabens „GCC in Cxx“<ref>http://gcc.gnu.org/wiki/gcc-in-cxx</ref> 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<ref>[http://gcc.gnu.org/wiki/cxx-conversion Cxx conversion]</ref> wurde auch die noch fehlende Stufe 1 des GCC-Bauprozesses auf C++-Code umgestellt.<ref>{{Internetquelle | url= https://www.heise.de/newsticker/meldung/GCC-setzt-intern-verstaerkt-auf-C-1668224.html | titel= GCC setzt intern verstärkt auf C++ | autor = Thorsten Leemhuis | hrsg=heise.de | datum=2012-08-16 | zugriff=2015-04-26 |sprache=}}</ref> Ausnahmen sind Backends, die in wesentlichen Teilen in RTL formuliert sind, sowie das Ada-Frontend, welches zum größten Teil in Ada geschrieben ist. |
||
Zeile 111: | Zeile 111: | ||
Bis vor kurzem war die Baumrepräsentation des Programms nicht völlig vom Zielprozessor unabhängig. Die Bedeutung eines Baums konnte für unterschiedliche Sprachfrontends unterschiedlich sein, und Frontends konnten ihren eigenen Baumcode zur Verfügung stellen. |
Bis vor kurzem war die Baumrepräsentation des Programms nicht völlig vom Zielprozessor unabhängig. Die Bedeutung eines Baums konnte für unterschiedliche Sprachfrontends unterschiedlich sein, und Frontends konnten ihren eigenen Baumcode zur Verfügung stellen. |
||
Mit dem Tree-[[Static Single Assignment|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 wurden ''GENERIC'' und ''GIMPLE'' getauft. 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 |
Mit dem Tree-[[Static Single Assignment|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 wurden ''GENERIC'' und ''GIMPLE'' getauft. 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. |
||
=== Middleend === |
=== Middleend === |
||
Zeile 117: | Zeile 117: | ||
=== Backend === |
=== Backend === |
||
Das Verhalten des GCC-Backends wird teilweise durch Präprozessor-Makros und architekturspezifische Funktionen bestimmt, mit denen zum Beispiel die [[Byte-Reihenfolge|Endianness]], Wortgröße, und Aufrufkonventionen definiert und die Registerstruktur der Zielmaschine beschrieben werden. Unter Verwendung der Maschinenbeschreibung, einer [[ |
Das Verhalten des GCC-Backends wird teilweise durch Präprozessor-Makros und architekturspezifische Funktionen bestimmt, mit denen zum Beispiel die [[Byte-Reihenfolge|Endianness]], Wortgröße, und Aufrufkonventionen definiert und die Registerstruktur der Zielmaschine beschrieben werden. Unter Verwendung der Maschinenbeschreibung, einer [[Lisp]]-ä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 ({{enS|''if-conversion, branch probability estimation, sibling calls, constant propagation'', ...}}) sowie der ''combine-pass'', in dem mehrere Instruktionen zu einer einzigen kombiniert werden können. |
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 ({{enS|''if-conversion, branch probability estimation, sibling calls, constant propagation'', ...}}) sowie der ''combine-pass'', in dem mehrere Instruktionen zu einer einzigen kombiniert werden können. |
||
Zeile 133: | Zeile 133: | ||
* [[GNU Pascal]] |
* [[GNU Pascal]] |
||
* [[distcc]], [[ccache]] |
* [[distcc]], [[ccache]] |
||
* [[MinGW]], eine Portierung auf |
* [[MinGW]], eine Portierung auf Windows |
||
* [[Portable C Compiler]] |
* [[Portable C Compiler]] |
||
Version vom 10. Januar 2017, 22:13 Uhr
GNU Compiler Collection
| |
---|---|
Basisdaten
| |
Maintainer | Richard Biener[1], Jakub Jelínek[2] |
Entwickler | GCC-Team |
Erscheinungsjahr | 1987 |
Aktuelle Version | 14.1[3] (7. Mai 2024) |
Betriebssystem | Unix, GNU/Linux, Windows, macOS, und andere |
Programmiersprache | C++, C |
Kategorie | Compiler |
Lizenz | GPL (Freie Software) |
deutschsprachig | ja |
gcc.gnu.org |
GCC ist der Name der Compiler-Suite des GNU-Projekts. GCC stand ursprünglich für GNU C Compiler. Da GCC heute aber außer C noch einige andere Programmiersprachen übersetzen kann, hat GCC inzwischen die Bedeutung GNU Compiler Collection erhalten (englisch für GNU-Compilersammlung). Das Kommando gcc (in Kleinbuchstaben) steht weiterhin für den C-Compiler.
Überblick
Die Sammlung enthält Compiler für die Programmiersprachen C, C++, Java, Objective-C, Fortran, Ada und Go. Die Compilersammlung unterliegt den Bedingungen der GNU General Public License.
GCC wird von einer Reihe von Systemen als Standardcompiler genutzt, darunter viele Linux-Distributionen, BSD-Varianten, NextStep, BeOS und ZETA. Zudem bietet er auch Unterstützung für die Laufzeitumgebung Cygwin und die Entwicklerwerkzeuge MinGW.[4] Er wurde auf mehr Systeme und Rechnerarchitekturen portiert als jeder andere Compiler und bietet sich besonders für Betriebssysteme an, die auf verschiedenen Hardware-Plattformen laufen sollen. Der GCC lässt sich auch als Cross-Compiler installieren.[5]
Geschichte
Die erste öffentliche Version (0.9) des GCC wurde am 22. März 1987 von Richard Stallman[6][7] für das GNU-Projekt freigegeben (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.
EGCS
1997 spaltete sich das Projekt Experimental/Enhanced GNU Compiler System (EGCS, engl. für experimentelles/verbessertes GNU-Compilersystem) von GCC ab, und wurde 1999 mit diesem wieder vereinigt.
GCC 1.x hatte 1991 eine gewisse Stabilität erreicht, jedoch verhinderten architekturbedingte Einschränkungen viele Verbesserungen, sodass die Free 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, das Eric S. Raymond in seinem Buch Die Kathedrale und der Basar beschreibt.
Die Tatsache, dass GCC freie Software ist, erlaubte es Programmierern, die in andere Richtung arbeiten wollten, eigene Abspaltungen zu 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.
Zielsysteme
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 Prozessoren erzeugen (primäre und sekundäre Evaluationsplattformen sind markiert):
- Alpha
- ARM-Architektur (sekundär, unter Linux)
- H8/300
- S/370, S/390
- i386 und AMD64
- IA-64 „Itanium“
- Motorola 68000 und Motorola Coldfire
- Motorola 88000
- MIPS-Architektur (primär unter IRIX)
- PA-RISC (primär unter HP-UX)
- PDP-11
- PowerPC
- SuperH
- Sun SPARC (primär unter Solaris, sekundär unter Linux)
- VAX
Dazu kommt noch eine Reihe von Prozessoren von eingebetteten Systemen, wie
- Motorola 68HC11
- A29K
- Adapteva Epiphany
- Atmel AVR und AVR32
- Blackfin
- C4x
- CRIS
- D30V
- DSP16xx
- FR-30
- FR-V
- Infineon TriCore
- Intel i960
- IP2000
- M32R
- MCORE
- MicroBlaze
- Microchip PIC24, dsPIC (nur in C) und PIC32 (auch in C++)
- MMIX
- MN10200, MN10300
- NS32K
- ROMP
- Stormy16
- Synopsis Designware ARC
- Texas Instruments MSP430, MSP432
- V850
- Xtensa
Nicht Bestandteil des offiziellen GCC, aber davon abgeleitet und kommerziell vertrieben gibt es Derivate für
Insgesamt unterstützt der GCC mehr als 60 Plattformen.[8]
Struktur
Das externe Interface des gcc entspricht dem eines Standard-Unix-Compilers.
- Der Benutzer ruft ein Hauptprogramm mit dem Namen
gcc
auf. - GCC interpretiert das Kommandozeilen-Argument.
- GCC stellt die Programmiersprache der vorliegenden Eingabedatei fest.
- Der entsprechende Sprach-Compiler wird aufgerufen.
- Die Ausgabe wird dem Assembler übergeben.
- Schließlich wird der Linker aufgerufen.
- Ein vollständiges, d. h. lauffähiges Programm wurde erstellt.
Jeder Sprachcompiler ist ein separates Programm, das Quellcode entgegennimmt und Assemblersprache produziert. Im Schema auf der rechten Seite sind Beispiele für C und Assembler gegeben, welche sich beide dem Preprocessing unterziehen müssen, bei dem Compilermakros, eingebundene Header-Dateien und Ähnliches umgewandelt werden, um reinen C-Code bzw. Assembler zu erhalten. Jenes sprachabhängige Frontend parst die entsprechende Sprache und erzeugt einen abstrakten Syntaxbaum, der an ein Backend übergeben wird, das den Baum in GCCs Register Transfer Language (RTL) überführt (im Diagramm nicht gezeigt), verschiedene Codeoptimierungen durchführt und zum Schluss Assemblersprache erzeugt.
Ursprünglich wurden die meisten Bestandteile der GCC in C geschrieben. Im Rahmen des Vorhabens „GCC in Cxx“[9] 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[10] wurde auch die noch fehlende Stufe 1 des GCC-Bauprozesses auf C++-Code umgestellt.[11] 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
Frontends müssen Bäume produzieren, die vom Backend verarbeitet werden können. Wie sie dies erreichen, bleibt ihnen überlassen. Einige Parser benutzen Yacc-ähnliche Grammatiken, andere verwenden handgeschriebene, rekursive Parser.
Bis vor kurzem war die Baumrepräsentation des Programms nicht völlig vom Zielprozessor unabhängig. Die Bedeutung eines Baums konnte für unterschiedliche Sprachfrontends unterschiedlich sein, und Frontends konnten ihren eigenen Baumcode zur Verfügung stellen.
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 wurden GENERIC und GIMPLE getauft. 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.
Middleend
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ören Dead code elimination, Partial Redundancy Elimination, Global Value Numbering, Sparse Conditional Constant Propagation, und Scalar replacement of Aggregates. Array-basierende Optimierungen wie zum Beispiel automatische Vektorisierung, wie sie der Intel-Compiler anbietet, werden gegenwärtig entwickelt.[12]
Backend
Das Verhalten des GCC-Backends wird teilweise durch Präprozessor-Makros und architekturspezifische Funktionen bestimmt, mit denen zum Beispiel die Endianness, Wortgröße, und Aufrufkonventionen definiert und die Registerstruktur der Zielmaschine beschrieben werden. Unter Verwendung der Maschinenbeschreibung, einer Lisp-ä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 (englisch if-conversion, branch probability estimation, sibling calls, constant propagation, ...) sowie der combine-pass, in dem mehrere Instruktionen zu einer einzigen kombiniert werden können.
Seit der kürzlichen 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 die Pipeline der Zielarchitektur beschaffen ist.
In der „Reload“-Phase wird die prinzipiell unbeschränkte Anzahl an abstrakten Pseudo-Registern durch 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 dem Stack der Funktion zwischenzuspeichern. Diese Registerzuteilung ist recht kompliziert, da die verschiedenen Eigenheiten der jeweiligen Zielarchitektur besonders berücksichtigt werden müssen.
In der letzten Phase werden Optimierungen durchgeführt, wie peephole optimization (engl. für Guckloch-Optimierung) und delay slot scheduling (engl. wörtlich für Verzögerung-Schlitz-Ablaufplanung), 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.
Siehe auch
- GNU Compiler for Java
- GNU Fortran
- GNU Debugger
- GNU Pascal
- distcc, ccache
- MinGW, eine Portierung auf Windows
- Portable C Compiler
Literatur
- Nikolaus Schüler: Der Gcc-Compiler: Überblick und Bedienung. bhv, 1997. ISBN 3-89360-873-7.
- Brian J. Gough, Richard M. Stallman: An Introduction to GCC: For the GNU Compilers GCC and G++. Network Theory Ltd. 2004. ISBN 978-0-954-16179-8.
- William von Hagen: The Definitive Guide to GCC. 2. Ausgabe, Apress 2006. ISBN 978-1-590-59585-5.
Einzelnachweise
- ↑ gcc.gnu.org. (abgerufen am 27. Mai 2022).
- ↑ github.com.
- ↑ Richard Biener: GCC 14.1 Released. 7. Mai 2024 (abgerufen am 7. Mai 2024).
- ↑ Jens Ihlenfeld: Compiler GCC 4.5.1 veröffentlicht. golem.de, 2. August 2010, abgerufen am 27. April 2015.
- ↑ Nikolaus Schüler: Der Gcc-Compiler – Überblick und Bedienung. 1. Auflage. bhv, Kaarst 1997, S. 28. ISBN 3-89360-873-7
- ↑ GNU C compiler beta test release – Nachricht bei Google Groups, vom 22. März 1987, abgerufen am 24. März 2012 (englisch).
- ↑ Alexander Neumann: GCC 4.7 und 25 Jahre GNU Compiler Collection. heise.de, 22. März 2012, abgerufen am 24. März 2012.
- ↑ Host/Target specific installation notes for GCC. In: gnu.org, 23. Februar 2006 (englisch).
- ↑ http://gcc.gnu.org/wiki/gcc-in-cxx
- ↑ Cxx conversion
- ↑ Thorsten Leemhuis: GCC setzt intern verstärkt auf C++. heise.de, 16. August 2012, abgerufen am 26. April 2015.
- ↑ AutovectBranchOptimizations. In: GCC-Wiki, vom 10. Januar 2008 (englisch).
Weblinks
- GCC, the GNU Compiler Collection – offizielle Website (englisch)
- GCC Frontend HOWTO – Anleitung zum Erstellen seines eigenen GCC-Frontends (englisch)
- Kurzanleitung für den GCC