GNU Compiler Collection

Die GNU Compiler Collection ist eine von der GNU-Projekt unterstützt verschiedene Programmiersprachen erzeugt Compilersystem. GCC ist eine Schlüsselkomponente der GNU-Toolchain. Die Free Software Foundation verteilt GCC unter der GNU General Public License. GCC hat eine wichtige Rolle für das Wachstum von freier Software als Werkzeug und ein Beispiel gespielt.

Ursprünglich unter dem Namen der GNU C Compiler, wenn es nur die Programmiersprache C behandelt wurde GCC 1.0 im Jahr 1987 veröffentlicht und der Compiler wurde erweitert, um C im Dezember desselben Jahres zu kompilieren ++. Frontends wurden später für Objective-C, Objective-C ++, Fortran, Java, Ada entwickelt und gehen unter anderem.

GCC hat zu einer Vielzahl von Prozessor-Architekturen portiert worden, und wird weithin als ein Werkzeug in der Entwicklung von sowohl kostenlose als auch proprietäre Software eingesetzt. GCC ist auch für die meisten Embedded-Plattformen, darunter Symbian, AMCC, und Freescale Power Architecture-basierten Chips zur Verfügung. Der Compiler kann eine Vielzahl von Plattformen, einschließlich Videospielkonsolen wie die PlayStation 2 und Dreamcast Ziel.

Abgesehen davon, dass die offizielle Compiler des GNU-Betriebssystem, hat GCC als Standard-Compiler von vielen anderen modernen Unix-ähnlichen Betriebssystemen wie Linux und BSD-Familie übernommen, auch wenn FreeBSD auf die LLVM-System bewegt. Versionen sind auch für Microsoft Windows und andere Betriebssysteme verfügbar.

Geschichte

In dem Bemühen, das GNU-Betriebssystem Bootstrap, fragte Richard Stallman Andrew S. Tanenbaum, der Autor des Amsterdamer Compiler Kit, wenn er, dass die Software für GNU nutzen könnten. Wenn Tanenbaum sagte ihm, dass, während die Freie Universität frei war, war der Compiler nicht, entschied Stallman, seine eigene zu schreiben. Stallmans ursprünglicher Plan war es, eine bestehende Compiler von Lawrence Livermore Laboratory von Pastell mit etwas Hilfe von Len Turm und andere neu zu schreiben, um C. Stallman hat eine neue C Front-End für die Livermore-Compiler, aber dann erkannte, dass es erforderlich ist Megabyte Stack-Speicher, eine Unmöglichkeit auf einem 68000 Unix System mit nur 64 KB, und festgestellt, würde er einen neuen Compiler von Grund auf neu zu schreiben. Keine der Pastel Compiler Code landete im GCC, obwohl Stallman hat die C-Frontende hatte er geschrieben.

GCC veröffentlicht wurde 22. März 1987, erhältlich von FTP vom MIT. Stallman als Autor aufgeführt, aber zitiert andere für ihre Beiträge, darunter Jack Davidson und Christopher Fraser für die Idee der Verwendung von RTL als Zwischensprache, Paul Rubin für das Schreiben die meisten der Präprozessor und Leonard Turm für "Teile der Parser, RTL-Generator RTL Definitionen und der Vax Maschinenbeschreibung. "

Bis 1991 hatte GCC 1.x einen Punkt der Stabilität erreicht, aber architektonische Einschränkungen verhindert vielen gewünschten Verbesserungen, so dass die FSF die Arbeit an GCC 2.x

Wie GCC wurde unter der GPL lizenziert, Programmierer wollen in andere Richtungen insbesondere solche schriftlich Schnittstellen zu anderen als C Sprachen frei, ihre eigenen Gabel des Compilers zu entwickeln waren zu arbeiten, sofern sie die GPL den Nutzungsbedingungen zu erfüllen, einschließlich der Anforderungen, um den Quellcode zu verteilen. Mehrere Gabeln bewiesen ineffizient und schwerfällig, aber, und die Schwierigkeiten bei der Arbeit der offiziellen GCC-Projekt akzeptiert war sehr frustrierend für viele. Das FSF hielt wie eine genaue Kontrolle darüber, was auf der offiziellen Version von GCC 2.x, die GCC wurde als ein Beispiel für die "Kathedrale" Entwicklungsmodell in Eric S. Raymonds Essay Die Kathedrale und der Basar genutzt aufgenommen.

Mit der Veröffentlichung von 4.4BSD in 1994 wurde der Standard-GCC-Compiler für die meisten BSD-Systemen.

Im Jahr 1997 bildete eine Gruppe von Entwicklern EGCS Experimental / Enhanced GNU Compiler-System, mehrere experimentelle Gabeln in einem einzigen Projekt zusammenzuführen. Die Grundlage für den Zusammenschluss war ein GCC Entwicklungsmomentaufnahme zwischen 2,7 und 2,81 Mitteilungen gemacht. Projekte zusammengeführt enthalten g77, PGCC, viele C ++ Verbesserungen, und viele neue Architekturen und Betriebssystemvarianten. EGCS Entwicklung erwies sich erheblich kräftiger als GCC-Entwicklung, so sehr, dass die FSF offiziell gestoppt Entwicklung auf ihren GCC 2.x-Compiler, gesegnet EGCS als die offizielle Version von GCC und ernannte den EGCS Projekt wie die GCC-Betreuer im April 1999 mit der Version von GCC 2.95 im Juli 1999 die beiden Projekte wurden wieder vereinigt.

GCC ist inzwischen durch einen abwechslungsreichen Gruppe von Programmierern aus der ganzen Welt unter der Leitung von einem Lenkungsausschuss beibehalten. Es wurde in mehreren Arten von Prozessoren und Betriebssysteme als jede andere Compiler portiert.

Design

GCC externe Schnittstelle folgt Unix-Konventionen. Benutzer rufen eine sprachspezifische Treiberprogramm, das Befehlsargumente interpretiert, ruft die tatsächlichen Compiler, Assembler läuft auf dem Ausgangs, und dann gegebenenfalls läuft den Linker an, eine vollständige ausführbare Binärdatei zu produzieren.

Jeder der Sprache Compiler ist ein separates Programm, das Quellcode und Ausgänge Maschinencode liest. Alle haben eine gemeinsame interne Struktur. Ein pro-Sprache Frontend analysiert den Quellcode in dieser Sprache und erzeugt einen Syntaxbaum.

Dies sind, falls erforderlich, die Eingabe-Darstellung der Mitte Ende, genannt GENERIC Form überführt; das mittlere Ende dann nach und nach verwandelt sich das Programm in Richtung seiner endgültigen Form. Compiler-Optimierungen und statische Code-Analyse-Techniken sind mit dem Code angewandt. Diese arbeiten an mehreren Darstellungen, meist dem architekturunabhängige GIMPLE Repräsentation und der Architektur-abhängige RTL-Darstellung. Schließlich wird Maschinencode mit architekturspezifischen Mustervergleich ursprünglich auf einem Algorithmus, der Jack Davidson und Chris Fraser auf Basis produziert.

GCC wurde in erster Linie in C mit Ausnahme von Teilen des Ada Frontend geschrieben. Die Distribution enthält die Standard-Bibliotheken für Ada, C ++ und Java, deren Code vor allem in diesen Sprachen geschrieben. Auf einigen Plattformen beinhaltet die Verteilung auch eine Low-Level-Laufzeitbibliothek libgcc, in einer Kombination von maschinenunabhängigen C und prozessorspezifische Maschinencode, in erster Linie entwickelt, um arithmetische Operationen, daß der Zielprozessor nicht direkt ausführen hand geschrieben.

Im Mai 2010 beschloss der GCC-Lenkungsausschusses, um die Verwendung eines C ++ Compiler erlauben, GCC kompilieren. Der Compiler bestimmt ist, in C geschrieben werden und eine Teilmenge von Merkmalen aus C ++. Insbesondere wurde dies entschieden, so dass GCC-Entwickler könnte die Destruktoren und Generika Features von C ++ verwenden.

Im August 2012 kündigte die GCC-Lenkungsausschuss, dass GCC verwendet jetzt C ++ wie ihre Umsetzung Sprache. Dies bedeutet, dass, um GCC aus Quellen zu bauen, ist eine C ++ Compiler erforderlich, die ISO / IEC C ++ 03-Standard versteht.

Frontends

Jedes Frontend verwendet einen Parser, um die Syntaxbaum Abstraktion einer bestimmten Quelldatei zu erzeugen. Aufgrund der Syntaxbaum Abstraktion Quelldateien können irgendeines der verschiedenen unterstützten Sprachen durch das gleiche Rückende verarbeitet werden. GCC begann mit LALR Parser mit Bison erzeugt, aber nach und nach umgeschaltet, um handgeschriebene rekursiv absteigende Parser; für C ++ im Jahr 2004 und für C und Objective-C im Jahr 2006. Derzeit werden alle Frontends verwenden handschriftliche rekursiv absteigende Parser.

Bis vor kurzem war die Baumdarstellung des Programms war nicht völlig unabhängig von der Prozessor angestrebt.

Die Bedeutung eines Baum war für unterschiedliche Sprach vorderen Enden etwas anders, und vordere Enden könnten ihre eigenen Baum-Codes bereitzustellen. Dies wurde mit der Einführung von Generika und GIMPLE, zwei neue Formen der sprachunabhängigen Bäume, die mit dem Aufkommen der GCC 4.0 eingeführt wurden vereinfacht. GENERIC ist komplexer, basierend auf Zwischendarstellung des GCC 3.x Java Frontend ist. GIMPLE ist eine vereinfachte GENERIC, in dem verschiedene Konstrukte, mehrere GIMPLE Anweisungen abgesenkt. Die C, C ++ und Java-Frontends herzustellen GENERIC direkt im Frontend. Andere Frontends statt unterschiedliche Zwischendarstellungen nach dem Parsen und wandeln diese in GENERIC.

In jedem Fall ist die so genannte "gimplifier" konvertiert die komplexere Form in die einfachere SSA-basierten GIMPLE Form, die die gemeinsame Sprache für eine große Anzahl von leistungsstarken Sprach- und architekturunabhängige globale Optimierungen ist.

Generika und GIMPLE

GENERIC ist ein Zwischenrepräsentationssprache als "Mitte Ende" verwendet beim Kompilieren Quellcode in ausführbare Binärdateien. Eine Untergruppe, genannt GIMPLE, wird durch all den vorderen Enden der GCC abgezielt.

Die mittlere Stufe des GCC hat alle von der Code-Analyse und Optimierung, unabhängig von sowohl der kompilierten Sprache und die Zielarchitektur arbeiten, ausgehend von der generische Darstellung und Ausweitung auf Transfer Language registrieren. Der generische Darstellung enthält nur die Teilmenge der imperativen Programmierung Konstrukte bis Mitte Ende optimiert.

Bei der Transformation der Quellencode GIMPLE werden komplexe Ausdrücke in eine drei Adresscode mit temporären Variablen aufgeteilt. Diese Darstellung wurde durch die einfache Darstellung in der MCCAT-Compiler von Laurie J. Hendren zur Vereinfachung der Analyse und Optimierung von imperativer Programme vorgeschlagen inspiriert.

Optimierung

Die Optimierung kann während der Phasen der Kompilierung auftreten; Jedoch sind die Hauptmenge Optimierungen nach der Syntax und semantischen Analyse des vorderen Endes und vor der Codeerzeugung des hinteren Endes durchgeführt wird; damit eine gemeinsame, wenn auch etwas widersprüchlich, Namen für diesen Teil des Compilers ist die "Mitte Ende."

Die genaue Menge der GCC-Optimierungen variiert von Version zu Version, wie es sich entwickelt, aber enthält die Standard-Algorithmen, wie zum Beispiel Kreisoptimierung, springen Gewindeschneiden, Eliminierung gemeinsamer Unterausdrücke, Befehlsplanung und so weiter. Die RTL-Optimierungen sind von geringerer Bedeutung, mit dem Zusatz von globalen SSA-basierten Optimierungen auf GIMPLE Bäumen, als RTL-Optimierungen haben eine sehr viel begrenzter Umfang, und haben weniger High-Level-Informationen.

Einige dieser Optimierungen auf dieser Ebene durchgeführt gehören Beseitigung von totem Code, Teilredundanzbeseitigung, globalen Wertschöpfungsnummerierung, spärlich bedingte ständige Ausbreitung und skalaren Austausch der Aggregate. Array Abhängigkeit der Basis-Optimierungen wie die automatische Vektorisierung und automatische Parallelisierung werden ebenfalls durchgeführt. Profil-geführte Optimierung ist möglich.

Back-End-

Das Verhalten der GCC-Backend wird teilweise durch Präprozessor-Makros und Funktionen speziell auf eine Zielarchitektur festgelegt, zum Beispiel, seine endianness, Wortgröße und Aufrufkonventionen definieren. Der vordere Teil des Back-End verwendet diese, um zu entscheiden, RTL Generation, so dass, obwohl GCC RTL nominell prozessorunabhängige, die Anfangssequenz von abstrakten Instruktionen ist bereits auf die Ziel angepasst. Zu jedem Zeitpunkt, die aktuellen Anweisungen RTL Bilden der Programmdarstellung haben mit der Maschinen-Beschreibung der Ziel-Architektur entsprechen.

Die Maschine Beschreibungsdatei enthält RTL-Muster, zusammen mit Operanden Einschränkungen und Code-Snippets zur Ausgabe der Endmontage. Die Einschränkungen anzugeben, dass eine bestimmte RTL Muster könnten nur für bestimmte Hardware-Register übernehmen, oder die sofortige Operanden Offsets der nur eine begrenzte Größe. Während RTL Generation werden die Randbedingungen für die jeweilige Zielarchitektur überprüft. Um einen bestimmten Ausschnitt des RTL auszustellen, so gibt sie eine der RTL-Muster in der Maschinenbeschreibungsdatei übereinstimmt, und erfüllen die Randbedingungen für dieses Muster; Andernfalls wäre es nicht möglich, die endgültige RTL in Maschinencode zu konvertieren.

Gegen Ende der Zusammenstellung ist gültig RTL einer strengen Form, in der jede Anweisung bezieht sich auf reale Maschine Registern und einem Muster aus Maschinenbeschreibungsdatei des Ziels reduziert. Bilden strengen RTL ist eine komplizierte Aufgabe; Ein wichtiger Schritt ist Registerzuweisung, wo echte Hardware-Register sind so gewählt, um die ursprünglich zugeordnete Pseudoregister zu ersetzen. Dies wird durch eine "Nachladen" Phase an; irgendwelche Pseudoregister, die eine echte Hardware-Register nicht vergeben wurden, werden "verschüttet", um den Stapel und RTL zum Ausführen dieser Verschütten erzeugt. Ebenso Offsets, die zu groß sind, um fit in eine tatsächliche Anweisung muss aufgebrochen und von RTL-Sequenzen, die die Offset-Einschränkungen nicht befolgt werden, zu ersetzen.

In der letzten Phase wird der Maschinencode, indem Sie einen kleinen Code-Snippet, mit jedem Muster zugeordnet ist, um die wirklichen Anweisungen vom Befehlssatz des Ziels zu erzeugen, wobei die letzten Register-Offsets und Adressen während des Reload-Phase gewählt gebaut. Die Montage-Generation-Snippet kann nur einen String, in welchem ​​Fall ein einfacher String-Substitution der Register, Offsets, und / oder Adressen in den String durchgeführt wird. Die Montage-Generation-Snippet kann auch einen kurzen Block von C-Code sein, die Durchführung einige zusätzliche Arbeit, aber am Ende der Rückführung einer Zeichenkette, die den gültigen Maschinencode.

Eigenschaften

Einige Features von GCC umfassen:

  • Link Zeit-Optimierung optimiert für Objektdatei Grenzen, um direkt zur Verbesserung der verknüpften binären. Link Zeit-Optimierung basiert auf einer Zwischendatei, die die Serialisierung von einigen -Gimple- Darstellung in der Objektdatei enthalten. Die Datei neben der Objekt-Datei während der Kompilierung Quelle erzeugt wird. Jede Quelle Kompilierung erzeugt ein separates Objekt-Datei und Verbindungszeit-Helfer-Datei. Wenn die Objekt-Dateien verknüpft sind, wird der Compiler erneut ausgeführt und verwendet die Hilfsdateien, Code über die separat kompilierten Objektdateien zu optimieren.
  • Plugins können die GCC-Compiler direkt zu verlängern. Plugins ermöglichen eine Aktien Compiler, um auf die spezifischen Bedürfnisse von externen Code als Plugins geladen zugeschnitten werden. So kann beispielsweise Plugins hinzufügen, ersetzen oder zu entfernen Mitte-End-Pässe auf Gimple Darstellungen arbeitet. Mehrere GCC Plugins wurden bereits veröffentlicht, insbesondere die GCC Python Plugin, das gegen libpython verbindet, und erlaubt es, beliebige Python-Skripte aus dem Inneren der Compiler aufzurufen. Das Ziel ist es, dass GCC Plugins in Python geschrieben werden. Die Schmelze-Plugin bietet eine High-Level-Lisp-ähnliche Sprache, um GCC zu verlängern.

Sprachen

Die Standard-Compiler-Versionen seit 4.6 sind Frontends für C, C ++, Objective-C, Objective-C ++, Fortran, Java, Ada und Gehen. Auch verfügbar, jedoch nicht im Standard sind Pascal, Merkur, Modula-2, Modula-3, PL / I, D und VHDL. Eine beliebte parallel Spracherweiterung, OpenMP, wird ebenfalls unterstützt.

Der Fortran Frontend wurde vor der Version 4.0, die nur unterstützt FORTRAN 77. In neueren Versionen G77, G77 wird zugunsten der neuen gfortran Frontend, Fortran 95 und Teile von Fortran 2003 unterstützt als auch fallen gelassen. Ein Front-End für CHILL wurde wegen mangelnder Wartung tropft.

Einige experimentelle Niederlassungen existieren, um weitere Sprachen, wie der GCC UPC Compiler für Unified Parallel C unterstützen

Architekturen

GCC Zielprozessorfamilien ab der Version 4.3 gehören:

  • Alpha
  • ARM
  • AVR
  • Blackfin
  • Dreikönigsfest
  • H8 / 300
  • HC12
  • IA-32
  • IA-64
  • MIPS
  • Motorola 68000
  • PA-RISC-
  • PDP-11
  • PowerPC
  • R8C / M16C / M32C
  • SPARC
  • SPU
  • SuperH
  • System / 390 / zSeries
  • VAX
  • x86-64

Weniger bekannten in der Standard-Version nicht unterstützt Zielprozessoren waren unter anderem:

  • 68HC11
  • A29K
  • CR16
  • C6x
  • D30V
  • DSP16xx
  • ETRAX CRIS
  • FR-30
  • FR-V
  • Intel i960
  • IP2000
  • M32R
  • MCORE
  • MIL-STD-1750A
  • MMIX
  • MN10200
  • MN10300
  • Motorola 88000
  • NS32K
  • ROMP
  • RL78
  • Stormy16
  • V850
  • Xtensa

Zusätzliche Prozessoren wurden von GCC-Versionen getrennt von der FSF-Version beibehalten unterstützt:

  • Cortus APS3
  • ARC
  • AVR32
  • C166 und C167
  • D10V
  • EISC
  • eSi-RISC
  • Hexagon
  • LatticeMico32
  • LatticeMico8
  • MeP
  • Microblaze
  • Motorola 6809
  • MSP430
  • NEC SX-Architektur
  • Nios II und Nios
  • OpenRISC
  • PDP-10
  • PIC24 / dsPIC
  • PIC32
  • Luftschraube
  • System / 370
  • TIGCC
  • TriCore
  • Z8000

Die gcj Java-Compiler kann entweder einen nativen Maschinensprache der Architektur oder der Java Virtual Machine Java-Bytecode Ziel. Wenn Retargeting GCC auf eine neue Plattform wird Bootstrapping oft verwendet.

Weiterentwicklung

Die aktuelle stabile Version von GCC 4.9.2; die am 30. Oktober 2014 veröffentlicht wurde nun GCC verwendet C ++ wie ihre Umsetzung Sprache.

GCC 4.6 unterstützt viele neue Objective-C-Funktionen, wie erklärt und synthetisiert Eigenschaften, Punkt-Syntax, schnelle Enumeration, Fakultativprotokoll Methoden, Verfahren / Protokoll / Klassenattribute, Klassenerweiterungen und einer neuen GNU Objective-C-Laufzeit-API. Es unterstützt auch die Go Programmiersprache und umfasst die Bibliothek, die Vierfach-Präzisions-mathematischen Funktionen auf Ziele unterstützen den Datentyp bietet. Die Bibliothek wird verwendet, um die Art in GNU Fortran auf solche Ziele vorgegeben werden.

GCC benutzt viele Standard-Tools in ihrem Build, einschließlich Perl, Flex, Bison und andere gängige Werkzeuge. Darüber hinaus bedarf es noch drei weitere Bibliotheken, um zu bauen anwesend sein dürfen: GMP, MPC und MPFR.

Der Stamm konzentriert den Hauptteil der Entwicklungsarbeit, in dem neue Funktionen implementiert und getestet. Letztendlich wird der Code aus dem Stamm der nächsten Hauptversion von GCC zu werden.

Führerschein

Die GCC-Laufzeitausnahme ermöglicht Erstellung von eigenen Programmen mit GCC und die Nutzung von freier Software Plugins.

Verwendungen

Mehrere Unternehmen machen ein Geschäft aus der Belieferung und Betreuung GCC-Ports auf verschiedene Plattformen und Chip-Hersteller heute betrachten eine GCC-Port fast unerlässlich, um den Erfolg einer Architektur.

Versionsgeschichte

  0   0
Vorherige Artikel Agent der Einfluss

In Verbindung Stehende Artikel

Kommentare - 0

Keine Kommentare

Fügen Sie einen Kommentar

smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile smile smile smile smile
smile smile smile smile
Zeichen übrig: 3000
captcha