Privacy Policy Cookie Policy Terms and Conditions GNU Compiler Collection - Wikipedia

GNU Compiler Collection

aus Wikipedia, der freien Enzyklopädie

GNU Compiler Collection
Bild:GCC_logo.png
Das Logo von GCC
Basisdaten
Entwickler: Das GCC-Team
Aktuelle Version: 4.1.1 (24. Mai 2006)
Betriebssystem: UNIX, Linux, Windows, Mac OS X, u. a.
Kategorie: Compiler
Lizenz: GPL
Deutschsprachig: ja
Website: gcc.gnu.org

GCC ist eine Abkürzung aus dem IT-Bereich für eine Sammlung von Programmen mit der ursprünglichen Bedeutung GNU C Compiler. Da GCC heute aber außer C noch eine Menge anderer Programmiersprachen unterstützt, hat GCC inzwischen die Bedeutung GNU Compiler Collection erhalten (engl. für GNU-Compilersammlung). Die Bezeichnung gcc (in Kleinbuchstaben) steht weiterhin für den C-Compiler.

Inhaltsverzeichnis

[Bearbeiten] Überblick

gcc 3.3.5 in einem Konsole-Fenster unter KDE 3.4.2 (Deutsch)
vergrößern
gcc 3.3.5 in einem Konsole-Fenster unter KDE 3.4.2 (Deutsch)

Die Sammlung enthält Compiler für die Programmiersprachen C, C++, Java, Objective-C, Fortran 95, Treelang und Ada. Die Compilersammlung unterliegt den Bedingungen der GNU General Public License.

Die erste öffentliche Version (0.9) des GCC wurde am 22. März 1987 von Richard Stallman 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.

GCC ist ein umfangreiches Projekt. Es besteht aus über 25.000 Dateien mit über 2,1 Millionen Zeilen Code.

GCC wird von einer Reihe von Systemen als Standardcompiler benutzt, darunter viele Linux-Distributionen, BSD, Mac OS X, NextStep, und BeOS bzw. ZETA. 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.

[Bearbeiten] Zielsysteme

Das GCC-Projekt entschied sich, einige Plattformen offiziell als primäre und andere als sekundäre Evaluationsplattformen zu bezeichnen. Vor jeder Veröffentlichung einer neuen Version werden insbesondere diese beiden Gruppen getestet. Zu den Prozessoren, für die GCC Programme erzeugen kann, gehören (primäre und sekundäre Evaluationsplattformen sind markiert):

Dazu kommen noch eine Reihe von Prozessoren aus dem Bereich eingebetteter Systeme, wie

  • Motorola 68HC11
  • A29K
  • ARC
  • Atmel AVR
  • C4x
  • CRIS
  • D30V
  • DSP16xx
  • FR-30
  • FR-V
  • Intel i960
  • IP2000
  • M32R
  • MCORE
  • MMIX
  • MN10200, MN10300
  • NS32K
  • ROMP
  • Stormy16
  • V850
  • Xtensa

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

[Bearbeiten] Struktur

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

  1. Der Benutzer ruft ein Hauptprogramm mit dem Namen gcc auf.
  2. GCC interpretiert das Kommandozeilen-Argument
  3. GCC stellt die Programmiersprache der vorliegenden Eingabedatei fest.
  4. Der entsprechende Sprach-Compiler wird aufgerufen.
  5. Die Ausgabe wird dem Assembler übergeben.
  6. Schließlich wird der Linker aufgerufen.
  7. Ein komplettes 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.

Fast alle Bestandteile des GCC sind in C geschrieben. Eine Ausnahme bildet das Ada-Frontend, das zum größten Teil in Ada geschrieben ist.

[Bearbeiten] 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 so genannte "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 können.

Optimierung an Bäumen passt eigentlich nicht in das Schema von „Frontend“ und „Backend“, da sie nicht sprachabhängig ist und kein Parsen beinhaltet. 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.

[Bearbeiten] 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 werden. Unter Verwendung dieser Informationen generiert das Backend die Register Transfer Language (RTL). 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. 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.

In einer „Reload“-Phase werden abstrakte Pseudo-Register durch echte Maschinenregister ersetzt, wobei Daten aus Strukturen verwendet werden, die den Befehlssatz des Ziels beschreiben. Diese Phase ist recht kompliziert, da die verschiedenen Eigenheiten der jeweiligen Zielarchitektur hier besonders berücksichtigt werden müssen.

Die letzte Phase ist relativ unspektakulär. Aus der bereits recht maschinennahen Umsetzung der RTL wird Assemblercode generiert, indem die Namen von Registern und Adressen in Strings umgesetzt werden, die die Instruktionen spezifizieren.

[Bearbeiten] Siehe auch

[Bearbeiten] Quellen

  1. Host/Target specific installation notes for GCC auf der gnu.org Webseite, 23. Februar, 2006

[Bearbeiten] Weblinks

Static Wikipedia 2008 (no images)

aa - ab - af - ak - als - am - an - ang - ar - arc - as - ast - av - ay - az - ba - bar - bat_smg - bcl - be - be_x_old - bg - bh - bi - bm - bn - bo - bpy - br - bs - bug - bxr - ca - cbk_zam - cdo - ce - ceb - ch - cho - chr - chy - co - cr - crh - cs - csb - cu - cv - cy - da - de - diq - dsb - dv - dz - ee - el - eml - en - eo - es - et - eu - ext - fa - ff - fi - fiu_vro - fj - fo - fr - frp - fur - fy - ga - gan - gd - gl - glk - gn - got - gu - gv - ha - hak - haw - he - hi - hif - ho - hr - hsb - ht - hu - hy - hz - ia - id - ie - ig - ii - ik - ilo - io - is - it - iu - ja - jbo - jv - ka - kaa - kab - kg - ki - kj - kk - kl - km - kn - ko - kr - ks - ksh - ku - kv - kw - ky - la - lad - lb - lbe - lg - li - lij - lmo - ln - lo - lt - lv - map_bms - mdf - mg - mh - mi - mk - ml - mn - mo - mr - mt - mus - my - myv - mzn - na - nah - nap - nds - nds_nl - ne - new - ng - nl - nn - no - nov - nrm - nv - ny - oc - om - or - os - pa - pag - pam - pap - pdc - pi - pih - pl - pms - ps - pt - qu - quality - rm - rmy - rn - ro - roa_rup - roa_tara - ru - rw - sa - sah - sc - scn - sco - sd - se - sg - sh - si - simple - sk - sl - sm - sn - so - sr - srn - ss - st - stq - su - sv - sw - szl - ta - te - tet - tg - th - ti - tk - tl - tlh - tn - to - tpi - tr - ts - tt - tum - tw - ty - udm - ug - uk - ur - uz - ve - vec - vi - vls - vo - wa - war - wo - wuu - xal - xh - yi - yo - za - zea - zh - zh_classical - zh_min_nan - zh_yue - zu -