GNU Compiler -Sammlung

GNU Compiler -Sammlung
GNU Compiler Collection logo.svg
GCC 10.2 GNU Compiler Collection self-compilation.png
Screenshot von GCC 10.2 kompiliert sein eigenes Quellcode
Originalautor (en) Richard Stallman
Entwickler (en) GNU -Projekt
Erstveröffentlichung 22. März 1987; vor 35 Jahren[1]
Stabile Version
12.1[2] Edit this on Wikidata / 6 Mai 2022
Repository
Geschrieben in C, C ++[3]
Betriebssystem Plattformübergreifend
Plattform GNU und viele andere
Größe ~ 15 Millionen Loc[4]
Verfügbar in Englisch
Typ Compiler
Lizenz GPLV3+ mit Ausnahme von GCC Runtime Library[5]
Webseite GCC.Gnu.org

Das GNU Compiler -Sammlung (GCC) ist ein Compiler optimieren produziert von der GNU -Projekt verschiedene verschiedene Programmiersprachen, Hardware -Architekturen und Betriebssysteme. Das Kostenlose Software -Stiftung (FSF) verteilt GCC als gratis Software unter dem GNU Allgemeine öffentliche Lizenz (GNU GPL). GCC ist eine Schlüsselkomponente der GNU Toolchain und der Standard -Compiler für die meisten Projekte im Zusammenhang mit GNU und die Linux Kernel. Mit rund 15 Millionen Code -Zeilen im Jahr 2019 ist GCC eines der größten freien Programme.[4] Es hat eine wichtige Rolle beim Wachstum von gespielt gratis Software, sowohl als Werkzeug als auch als Beispiel.

Als es 1987 von 1987 veröffentlicht wurde Richard Stallman, GCC 1.0 wurde als der benannt GNU C Compiler Da es nur umgegangen ist C Programmiersprache.[1] Es wurde erweitert, um zusammenzuarbeiten C ++ im Dezember dieses Jahres. Frontenden wurden später für entwickelt für Ziel c, Ziel-C ++, Forran, Ada, D und gehen, unter anderen.[6] Das OpenMP und OpenACC Die Spezifikationen werden auch in den C- und C ++ - Compilern unterstützt.[7][8]

GCC war gewesen portiert zu mehr Plattformen und Anweisungsset Architekturen als jeder andere Compiler und wird weit verbreitet als Werkzeug für die Entwicklung von freiem und proprietäre Software. GCC ist auch für viele erhältlich eingebettete Systeme, einschließlich ARM-baut und Macht ISA-basierte Chips.

Sowie der offizielle Compiler der GNU -Betriebssystem, GCC wurde von vielen anderen Modern als Standard Compiler übernommen Unix-artig Computer Betriebssysteme, einschließlich der meisten Linux Verteilungen. Die meisten BSD Familienbetriebssysteme wechselten auch kurz nach seiner Veröffentlichung zu GCC, obwohl seitdem, jedoch Freebsd, OpenBSD und Apple macos wechselten in die Klang Compiler,[9] größtenteils aufgrund von Lizenzgründen.[10][11][12] GCC kann auch Code für kompilieren Fenster, Android, iOS, Solaris, HP-UX, AIX und DOS.[13]

Geschichte

Ende 1983, um es zu tun Bootstrap das GNU Betriebssystem, Richard Stallman fragte Andrew S. Tanenbaum, der Autor der Amsterdam Compiler Kit (auch bekannt als die Freie Universität Compiler -Kit) für die Erlaubnis, diese Software für GNU zu verwenden. Als Tanenbaum ihm beriet, der Compiler sei nicht frei und dass nur die Universität frei war, beschloss Stallman, an einem anderen Compiler zu arbeiten.[14] Sein erster Plan bestand darin, einen bestehenden Compiler von neu zu schreiben Lawrence Livermore National Laboratory aus Pastell C mit etwas Hilfe von Len Tower und andere.[15][16] Stallman schrieb ein neues C -Frontend für den Livermore Compiler, stellte dann jedoch fest, dass es Megabyte Stapelraum erforderte, eine Unmöglichkeit auf einem 68000 UNIX -System mit nur 64 KB und kam zu dem Schluss, dass er einen neuen Compiler von Grund auf neu schreiben müsste.[15] Keiner der Pastell Compiler -Code landete in GCC, obwohl Stallman das C -Frontend verwendet hatte, das er geschrieben hatte.[15][17]

GCC wurde erstmals am 22. März 1987 veröffentlicht, erhältlich von Ftp aus MIT.[18] Stallman wurde als Autor aufgeführt, zitierte jedoch andere für ihre Beiträge, darunter Jack Davidson und Christopher Fraser für die Idee der Verwendung RTL Als Zwischensprache Paul Rubin für den größten Teil des Präprozessors und Leonard Tower für "Teile des Parser-, RTL -Generators, RTL -Definitionen und der Beschreibung der VAX -Maschine".[19] Beschrieben als "erste freie Software getroffen" von Peter H. SalusDer GNU -Compiler kam gerade zu der Zeit an, als Sun Microsystems hat seine Entwicklungstools von entschlüsselt sein Betriebssystem, verkauft sie separat zu einem höheren kombinierten Preis als das vorherige Bundle, das viele Benutzer von Sun zum Kauf oder Herunterladen von GCC anstelle der Tools des Anbieters veranlasste.[20] Während Stallman überlegte GNU EMACS Als sein Hauptprojekt unterstützte GCC bis 1990 dreizehn Computerarchitekturen, übertrafen mehrere Anbieter -Compiler und wurde von mehreren Unternehmen kommerziell eingesetzt.[21]

EGCS -Gabel

Da GCC unter der GPL lizenziert wurde, waren Programmierer, die in andere Richtungen arbeiten wollten - insbesondere diejenigen, die Schnittstellen für andere Sprachen als C haben - frei, ihre eigenen zu entwickeln Gabel des Compilers, sofern sie die Bedingungen der GPL entsprechen, einschließlich seiner Verteilungsanforderungen Quellcode. Mehrere Gabeln erwiesen sich jedoch als ineffizient und unhandlich, und die Schwierigkeit, die Arbeit vom offiziellen GCC -Projekt akzeptieren zu lassen, war für viele sehr frustrierend, da das Projekt die Stabilität gegenüber neuen Funktionen bevorzugte.[22] Die FSF behielt so genau die Kontrolle über das, was zur offiziellen Version von GCC 2.x (seit 1992 entwickelt) hinzugefügt wurde, dass GCC als Beispiel für das Entwicklungsmodell "Kathedrale" verwendet wurde Eric S. Raymond's Essay Die Kathedrale und der Basar.

1997 bildete eine Gruppe von Entwicklern die Experimentelles/erweitertes GNU -Compiler -System (EGCS) Mehrere experimentelle Gabeln in ein einzelnes Projekt zusammenzuführen.[22][17] Die Grundlage des Zusammenschlusses war ein Entwicklungs -Schnappschuss von GCC (rund 2,7,2 und später bis zu 2,8,1 veröffentlicht). Fusionen umfassten G77 (FORTRAN), PGCC (P5 Pentium-optimiertes GCC),[17] viele C ++ - Verbesserungen und viele neue Architekturen und Betriebssystem Varianten.[23]

Während beide Projekte sich gegenseitig umeinander verfolgten, erwies sich die EGCS -Entwicklung als wesentlich energischer, so sehr, dass die FSF die Entwicklung ihres GCC 2.x -Compilers offiziell einstellte Die Betreuer im April 1999. Mit der Veröffentlichung von GCC 2.95 im Juli 1999 waren die beiden Projekte erneut vereint.[24][17] GCC wurde seitdem von einer verschiedenen Gruppe von Programmierern aus der ganzen Welt unter der Leitung eines Lenkungsausschusses aufrechterhalten.[25]

GCC 3 (2002) entfernte ein Frontend für AUSRUHEN Aufgrund mangelnder Wartung.[26]

Vor Version 4.0 war das Forran Front End G77, was nur unterstützte Forran 77, aber später wurde zugunsten des Neuen fallen gelassen Gnu Forran Frontend, das unterstützt Forran 95 und große Teile von Forran 2003 und FORTRAN 2008 auch.[27][28]

Ab Version 4.8 ist GCC in C ++ implementiert.[29]

Unterstützung für Cilk Plus existierte von GCC 5 bis GCC 7.[30][31]

GCC war gewesen portiert zu einer Vielzahl von Anweisungsset Architekturenund wird weithin als Werkzeug für die Entwicklung von freiem und weit verbreitet eingesetzt proprietäre Software. GCC ist auch für viele erhältlich eingebettete Systeme, einschließlich Symbian (genannt GCCE),[32] ARM-basis und Macht ISA-basierte Chips.[33] Der Compiler kann eine Vielzahl von Plattformen ansprechen, einschließlich Videospielkonsolen so wie die Playstation 2,[34] Zellspe von PlayStation 3,[35] und Traumbesetzung.[36] Es wurde auf mehr Arten von portiert Prozessoren und Betriebssysteme als jeder andere Compiler.[37][Selbstveröffentlichte Quelle?]

Unterstützte Sprachen

Ab Mai 2021Die jüngste Veröffentlichung von GCC von 11.1 enthält vordere Enden für C (GCC), C ++ (G ++), Ziel c, Forran (GFortran), Ada (MÜCKE), gehen (gccgo) und D (GDCseit 9,1)[38] Programmiersprachen,[39] mit dem OpenMP und OpenACC Parallele Spracherweiterungen werden seit GCC 5.1 unterstützt.[8][40] Versionen vor GCC 7 unterstützten ebenfalls Java (GCJ), Ermöglichung der Zusammenstellung von Java zu nativem Maschinencode.[41]

In Bezug auf die Sprachversionsunterstützung für C ++ und C, da GCC 11.1 das Standardziel ist GNU ++ 17, ein Superset von C ++ 17, und gnu11, ein Superset von C11, mit strenger Standardunterstützung auch verfügbar. GCC bietet auch experimentelle Unterstützung für C ++ 20 und bevorstehend C ++ 23.[42]

Frontendenden von Drittanbietern gibt es für viele Sprachen, wie z. Pascal (GPC), Modula-2, Modula-3, und VHDL (GHDL).[39] Es gibt einige experimentelle Zweige, um zusätzliche Sprachen zu unterstützen, z. B. den GCC UPC Compiler für Einheitlich parallel c[43] oder Rost.[44]

Entwurf

Überblick über die erweiterte Zusammenstellung von GCC, einschließlich spezialisierter Programme wie die Präprozessor, Assembler und Linker.
GCC folgt der dreistufigen Architektur, die für mehrsprachige und Multi-CPU typisch ist Compiler. Alle Programmbäume werden in eine gemeinsame abstrakte Darstellung am "Mittelende" umgewandelt, was zulässt Codeoptimierung und Binärcode Generationseinrichtungen, die von allen Sprachen geteilt werden sollen.

Die externe Schnittstelle von GCC folgt Unix Konventionen. Benutzer rufen ein sprachspezifisches Treiberprogramm auf (GCC für c, G ++ für c ++ usw.), die interpretiert Befehlsargumenteruft den tatsächlichen Compiler an, führt die aus Assembler auf der Ausgabe und dann optional die Ausführung der Linker eine vollständige Erzeugung erzeugen ausführbar binär.

Jeder der Sprachkompiler ist ein separates Programm mit dem Quellcode und Ausgaben liest Maschinensprache. Alle haben eine gemeinsame interne Struktur. Ein prosprachiges Frontend Parsen der Quellcode in dieser Sprache und erzeugt eine Zusammenfassung Syntaxbaum ("Baum" kurz).

Diese werden bei Bedarf in die Eingabedarstellung des mittleren Endes umgewandelt, genannt GENERISCH bilden; Das Mittelende verwandelt dann das Programm nach und nach in seine endgültige Form. Compiler -Optimierungen und Statische Codeanalyse Techniken (z. B. Fortify_Source,[45] Eine Compiler -Richtlinie, die versucht, einige zu entdecken Pufferüberläufe) werden auf den Code angewendet. Diese Arbeiten an mehreren Darstellungen, hauptsächlich der architekturunabhängigen Gimple-Repräsentation und der architekturabhängigen RTL Darstellung. Endlich, Maschinensprache wird mit architekturspezifischen Produkten produziert Musteranpassung Ursprünglich basierend auf einem Algorithmus von Jack Davidson und Chris Fraser.

GCC wurde hauptsächlich in geschrieben C außer für Teile der Ada Frontend. Die Verteilung umfasst die Standardbibliotheken für ADA und C ++ deren Code hauptsächlich in diesen Sprachen geschrieben ist.[46] Auf einigen Plattformen enthält die Verteilung auch eine Laufzeitbibliothek auf niedriger Ebene. libgcc, geschrieben in einer Kombination aus maschinenunabhängiger C und prozessorspezifisch Maschinensprache, in erster Linie für die Behandlung von arithmetischen Operationen entwickelt, die der Zielprozessor nicht direkt ausführen kann.[47]

GCC verwendet viele zusätzliche Tools in seinem Build, von denen viele standardmäßig von vielen Unix- und Linux -Verteilungen installiert werden (die jedoch normalerweise nicht in Windows -Installationen vorhanden sind), einschließlich Perl,[Weitere Erklärung erforderlich] Biegen, Bisonund andere gemeinsame Werkzeuge. Darüber hinaus müssen derzeit drei zusätzliche Bibliotheken vorhanden sein, um zu erstellen: GMP, MPC und MPFR.[48]

Im Mai 2010 beschloss das GCC -Lenkungskomitee, eine Verwendung von a zu ermöglichen C ++ Compiler zum kompilierten GCC.[49] Der Compiler sollte hauptsächlich in C plus einer Untergruppe von Merkmalen von C ++ geschrieben werden. Insbesondere wurde dies entschieden, damit die Entwickler von GCC die nutzen konnten Zerstörer und Generika Merkmale von C ++.[50]

Im August 2012 kündigte das GCC -Lenkungsausschuss an, dass GCC C ++ nun als Umsetzungssprache verwendet.[51] Dies bedeutet, dass ein C ++ - Compiler erforderlich ist, um GCC aus Quellen zu bauen, der versteht ISO/IEC C ++ 03 Standard.

Am 18. Mai 2020 bewegte sich GCC von weg von ISO/IEC C ++ 03 Standard zu ISO/IEC C ++ 11 Standard (d. H. Zum Kompilieren, Bootstrap, der Compiler selbst; standardmäßig kompiliert es jedoch spätere Versionen von C ++).[52]

Frontenden

Frontenden bestehen aus Vorverarbeitung, lexikalische Analyse, Syntaktische Analyse (Parsen) und semantische Analyse. Die Ziele der Compiler -Frontenden sind es, Kandidatenprogramme entsprechend der Sprachgrammatik und der Semantik zu akzeptieren oder abzulehnen, Fehler zu identifizieren und gültige Programmdarstellungen in späteren Compiler -Stadien zu verarbeiten. Dieses Beispiel zeigt die Lexer- und Parser -Schritte, die für ein einfaches Programm in geschriebenem Programm durchgeführt werden C.

Jeder Frontend verwendet einen Parser, um die zu produzieren Zusammenfassung Syntaxbaum von einem gegebenen Quelldatei. Aufgrund der Abstraktion der Syntaxbaum Back End. GCC begann zu benutzen Lalr -Parser erzeugt mit Bison, aber allmählich auf handgeschriebene umgestellt rekursive Abzüge Parser Für C ++ im Jahr 2004,[53] und für C und Objective-C im Jahr 2006.[54] Ab 2021 verwenden alle vorderen Enden handgeschriebene rekursive Parser.

Bis GCC 4.0 war die Baumpräsentation des Programms nicht vollständig unabhängig von dem Prozessor. Die Bedeutung eines Baumes war für verschiedene Sprachenden etwas anders, und die Frontenden konnten ihre eigenen Baumcodes liefern. Dies wurde durch die Einführung von Generika und Gimple vereinfacht, zwei neue Formen von sprachunabhängigen Bäumen, die mit dem Aufkommen von GCC 4.0 eingeführt wurden. Generic ist komplexer und basiert auf der Zwischendarstellung des GCC 3.x Java Frontend. Gimple ist ein vereinfachtes Generikum, bei dem verschiedene Konstrukte sind gesenkt zu mehreren Gimple -Anweisungen. Das C, C ++, und Java Frontenden erzeugen generisch direkt am vorderen Ende. Andere Frontenden haben stattdessen unterschiedliche Zwischendarstellungen nach Parsen und Umwandlung in Generika.

In beiden Fällen konvertiert der sogenannte "Gimplifier" diese komplexere Form in die einfachere SSA-Basierte Gimple-Form, die die gemeinsame Sprache für eine große Anzahl mächtiger Sprach- und Architektur-unabhängiger globaler (Funktionsumfang) Optimierungen ist.

Generika und Gimple

GENERISCH ist ein Zwischendarstellung Die Sprache, die als "Mittelend" verwendet wird, während der Quellcode in Kompilierung ist in ausführbare Binärdateien. Eine Untergruppe, genannt Gimple, wird von allen vorderen Enden von GCC angegriffen.

Die mittlere Stufe von GCC führt die gesamte Codeanalyse durch und Optimierung, unabhängig von der kompilierten Sprache und der Zielarchitektur, beginnend von der Generika[55] Darstellung und Erweiterung auf Übertragungssprache registrieren (RTL). Die generische Darstellung enthält nur die Teilmenge des Imperativen Programmierung Konstrukte optimiert vom Mittelende.

Bei der Transformation des Quellcodes in das Gimple,[56] Komplex Ausdrücke sind in a aufgeteilt Dreiadress-Code Verwendung Temporäre Variablen. Diese Darstellung wurde von der einfachen Darstellung inspiriert, die im McCat Compiler vorgeschlagen wurde[57] von Laurie J. Hendren[58] zur Vereinfachung der Analyse und Optimierung von Imperative Programme.

Optimierung

Die Optimierung kann während jeder Zusammenstellung auftreten. Der Großteil der Optimierungen wird jedoch nach der Syntax und der semantischen Analyse des Frontends und vor dem durchgeführt Codegenerierung des hinteren Ende; So ist ein häufiges, obwohl etwas widersprüchlicher Name für diesen Teil des Compilers das "Mittelende".

Der genaue Satz von GCC -Optimierungen variiert von der Release bis zur Freigabe, die sich entwickelt, jedoch die Standardalgorithmen wie z. Schleifenoptimierung, Sprungfaden, gemeinsame Eliminierung der Subtonpression, Anweisungsplanung, und so weiter. Das RTL Optimierungen sind bei der Hinzufügung globaler SSA-basierter Optimierungen von weniger wichtig Gimple Bäume,[59] Da RTL-Optimierungen einen viel begrenzten Bereich haben und weniger Informationen auf hoher Ebene haben.

Einige dieser Optimierungen, die auf dieser Ebene durchgeführt wurden Dead-Code-Eliminierung, Teilredundanz-Eliminierung, Globale Wertnummerierung, spärliche konstante konstante Ausbreitungund skalarer Austausch von Aggregaten. Array -Abhängigkeits -basierte Optimierungen wie z. Automatische Vektorisierung und Automatische Parallelisierung werden auch durchgeführt. Profilgesteuerte Optimierung ist auch möglich.[60]

Back End

Das Back End des GCC wird teilweise angegeben durch Präprozessor -Makros und Funktionen für eine Zielarchitektur, zum Beispiel, um ihre zu definieren Endiangess, Wortgröße, und Konventionen anrufen. Der vordere Teil des Back End verwendet diese, um die RTL-Generierung zu entscheiden. Obwohl GCCs RTL nominell prozessorunabhängig ist, ist die anfängliche Abfolge abstrakter Anweisungen bereits an das Ziel angepasst. In jedem Moment müssen die tatsächlichen RTL -Anweisungen, die die Programmdarstellung bilden, der Maschinenbeschreibung der Zielarchitektur entsprechen.

Die Maschinenbeschreibungsdatei enthält RTL -Muster sowie Operandenbeschränkungen und Code -Snippets, um die Endbaugruppe auszugeben. Die Einschränkungen zeigen, dass ein bestimmtes RTL -Muster möglicherweise nur (z. B.) für bestimmte Hardwareregister gelten oder (z. B. (z. B.) sofortige Operand -Offsets von nur einer begrenzten Größe (z. B. 12, 16, 24, ... Bit -Offsets usw. ). Während der RTL -Erzeugung werden die Einschränkungen für die angegebene Zielarchitektur überprüft. Um ein bestimmtes RTL -Ausschnitt auszugeben, muss es mit einem (oder mehr) der RTL -Muster in der Maschinenbeschreibungsdatei übereinstimmen und die Einschränkungen für dieses Muster erfüllen. Andernfalls wäre es unmöglich, das endgültige RTL in den Maschinencode umzuwandeln.

Gegen Ende der Zusammenstellung wird gültiger RTL auf a reduziert strikt Formular, in dem sich jede Anweisung auf reale Maschinenregister und ein Muster aus der Maschinenbeschreibungsdatei des Ziels bezieht. Die Bildung strenger RTL ist eine komplizierte Aufgabe; Ein wichtiger Schritt ist Zuteilung registrieren, wo echte Hardware-Register ausgewählt werden, um die ursprünglich zugewiesenen Pseudo-Register zu ersetzen. Darauf folgt eine "Nachladen" -Phase; Alle Pseudo-Register, denen kein echtes Hardware-Register zugewiesen wurde, werden dem Stapel "verschüttet", und RTL, um dieses Verschütten durchzuführen, wird generiert. Ebenso müssen Offsets, die zu groß sind, um in einen tatsächlichen Befehl zu passen, aufgebrochen und durch RTL -Sequenzen ersetzt werden, die den Offset -Einschränkungen befolgen.

In der letzten Phase wird der Maschinencode erstellt, indem ein kleiner Codeausschnitt aufgerufen wird, der jedem Muster zugeordnet ist, um die realen Anweisungen aus dem Ziel des Ziels zu generieren Befehlssatzmit den endgültigen Registern, Offsets und Adressen, die während der Nachladephase ausgewählt wurden. Der Snippet der Montage-Generation-Snippet kann nur eine Zeichenfolge sein. In diesem Fall wird eine einfache String-Substitution der Register, Offsets und/oder Adressen in die Zeichenfolge durchgeführt. Der Snippet der Montage-Generation-Snippet kann auch ein kurzer Block C-Code sein, der zusätzliche Arbeiten ausführt, jedoch letztendlich eine Zeichenfolge mit dem gültigen Montagecode zurückgibt.

C ++ Standardbibliothek (libstdc ++)

Das GCC -Projekt enthält eine Implementierung der C ++ Standardbibliothek libstdc ++ genannt,[61] Lizenziert unter der GPLV3 -Lizenz mit Ausnahme von Link Closed Source -Anwendung, wenn Quellen mit GCC erstellt werden.[62] Die aktuelle Version ist 11[wenn?].

Andere Eigenschaften

Einige Merkmale von GCC sind:

Link-Zeit-Optimierung
Link-Zeit-Optimierung Optimiert über Objektdateigrenzen hinweg, um die verknüpfte Binärdatei direkt zu verbessern. Die Link-Zeit-Optimierung basiert auf einer Zwischendatei, die die Serialisierung einiger enthält Gimple Darstellung in der Objektdatei enthalten. Die Datei wird neben der Objektdatei während der Quellkompilierung generiert. Jede Quellkompilierung generiert eine separate Objektdatei und eine Link-Zeit-Helferdatei. Wenn die Objektdateien verknüpft sind, wird der Compiler erneut ausgeführt und verwendet die Helferdateien, um den Code über die separat kompilierten Objektdateien zu optimieren.
Plugins
Plugins Erweitern Sie den GCC -Compiler direkt.[63] Mit Plugins kann ein Aktien Compiler nach externen Code als Plugins auf bestimmte Anforderungen zugeschnitten werden. Zum Beispiel können Plugins mittlere Endpässe addieren, ersetzen oder sogar entfernen, die eingeschaltet werden Gimple Darstellungen.[64] Es wurden bereits mehrere GCC -Plugins veröffentlicht, insbesondere:
  • Das Python -Plugin, das gegen libpython verknüpft und es ermöglicht, beliebige Python -Skripte aus dem Compiler aufzurufen. Ziel ist es, GCC -Plugins in Python zu ermöglichen.
  • Das Schmelz-Plugin bietet einen hohen Niveau Lispeln-ähnliche Sprache, um GCC zu erweitern.[65]
Die Unterstützung von Plugins war einst ein umstrittenes Problem im Jahr 2007.[66]
C ++ Transaktionsspeicher
Die C ++ - Sprache hat einen aktiven Vorschlag für den Transaktionsgedächtnis. Es kann in GCC 6 aktiviert und beim Kompilieren neuer mit -fgnu-tm.[7][67]
Unicode -Identifikatoren
Obwohl die C ++-Sprache Unterstützung für Nicht-ASCII erfordert Unicode -Zeichen in KennungenDie Funktion wurde erst seit GCC 10 unterstützt. Wie bei der vorhandenen Handhabung von String -Literalen wird angenommen, dass die Quelldatei in codiert wird in UTF-8. Die Funktion ist in C optional, wurde aber auch seit dieser Änderung zur Verfügung gestellt.[68][69]
C Erweiterungen
GNU C erweitert die C-Programmiersprache mit mehreren nicht standardmäßigen Merkmalen, einschließlich verschachtelte Funktionen[70] und Art der Ausdrücke.[71]

Architekturen

GCC -Kompilierung Hallo Welt an Fenster

GCC -Zielprozessorfamilien ab Version 11.1 enthalten:[72]

In der Standardveröffentlichung unterstützte weniger bekannte Zielprozessoren wurden: enthalten:

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

Das GCJ Der Java -Compiler kann entweder auf eine native Architektur für Maschinensprachen oder auf die Anlage abzielen Java virtuelle Maschine's Java -Bytecode.[75] Wann Retargeting GCC auf eine neue Plattform, Bootstrapping wird oft verwendet. Motorola 68000, Zilog Z80 und andere Prozessoren sind auch in den GCC -Versionen gezielt, die für verschiedene programmierbare Graphing -Taschenrechner von Texas, Hewlett Packard, Sharp und Casio entwickelt wurden.[76]

Lizenz

GCC ist unter dem lizenziert GNU Allgemeine öffentliche Lizenz Version 3.[77] Das GCC -Laufzeitausnahme Ermöglicht die Zusammenstellung von proprietären Programmen (zusätzlich zur freien Software) mit GCC. Dies wirkt sich nicht auf die Lizenzbedingungen des GCC -Quellcodes aus.[78]

Siehe auch

Verweise

  1. ^ a b "GCC veröffentlicht". GNU -Projekt. Abgerufen 24. Juli, 2020.
  2. ^ "GCC 12.1 veröffentlicht"; Autorenname String: Richard Biener; Veröffentlichungsdatum: 6. Mai 2022; Abgerufen: 6. Mai 2022.
  3. ^ "GCC -Codierungskonventionen - GNU -Projekt". gcc.gnu.org. Abgerufen 7. Februar, 2022.
  4. ^ a b Víctor Rodríguez (1. Oktober 2019). "Speiseköpfige Toolchain (neueste Funktionen in GCC/GLIBC)". youtube.com. Linux Foundation. Archiviert vom Original am 7. November 2021. Abgerufen 19. Januar, 2021.
  5. ^ "GCC Runtime Library Ausnahme". Abgerufen 24. Juli, 2020.
  6. ^ "Programmiersprachen, die von GCC unterstützt werden". GNU -Projekt. Abgerufen 23. Juni, 2014.
  7. ^ a b "GCC 6 Release -Serie - Änderungen, neue Funktionen und Korrekturen - GNU -Projekt". gcc.gnu.org.
  8. ^ a b "OpenACC - GCC Wiki". gcc.gnu.org.
  9. ^ "Das LLVM -Compiler -Infrastrukturprojekt". llvm.org.
  10. ^ "Apples GPLV3 -Säuber". meta.ath0.com. Abgerufen 12. Januar, 2021.
  11. ^ Linnemann, Reid (20. Juni 2012). "Warum Klang". Abgerufen 12. Januar, 2021.
  12. ^ "29. August 2007: Newsletter FreeBSD Foundation, 29. August 2007". 11. Oktober 2007. archiviert von das Original am 11. Oktober 2007. Abgerufen 12. Januar, 2021.
  13. ^ "Installieren von GCC: Binärdateien - GNU -Projekt - Free Software Foundation (FSF)". gcc.gnu.org. Abgerufen 12. Januar, 2021.
  14. ^ Von Hagen, William (2006). Der endgültige Leitfaden für GCC. Definitive Leitfäden (2. Aufl.). Apress. p. Xxvii. ISBN 978-1-4302-0219-6. Also schrieb er an Vucks Autor und fragte, ob GNU es benutzen könnte. Offensichtlich war Vucks Entwickler unkooperativ und antwortete, dass die Universität frei war, der Compiler jedoch nicht.
  15. ^ a b c Stallman, Richard (20. September 2011). "Über das GNU -Projekt". Das GNU -Projekt. Abgerufen 9. Oktober, 2011.
  16. ^ Puzo, Jerome E., hrsg. (Februar 1986). "Gnus Zoo". Gnus Bulletin. Kostenlose Software -Stiftung. 1 (1). Abgerufen 11. August, 2007.
  17. ^ a b c d Von Hagen, William (2006). Der endgültige Leitfaden für GCC. Definitive Leitfäden (2. Aufl.). Apress. p. Xxvii. ISBN 978-1-4302-0219-6.
  18. ^ Richard M. Stallman (weitergeleitet von Leonard H. Tower Jr.) (22. März 1987). "GNU C Compiler Beta Test Release". Newsgroup:comp.lang.c. Abgerufen 9. Oktober, 2011.
  19. ^ Stallman, Richard M. (22. Juni 2001) [erstmals veröffentlicht 1988], "Mitwirkende zu GNU CC", Verwenden und Portieren der GNU Compiler Collection (GCC), Free Software Foundation, Inc., p. 7, abgerufen 18. Juni, 2015.
  20. ^ Salus, Peter H. (2005). "Kapitel 10. Sonne und GCC". Der Daemon, der GNU und der Pinguin. Groklaw.
  21. ^ Garfinkel, Simson L. (6. August 1990). "Machen Sie sich bereit für GNU -Software". Computerwelt. p. 102.
  22. ^ a b Henkel-Wallace, David (15. August 1997), Ein neues Compiler -Projekt zur Zusammenführung der vorhandenen GCC -Gabeln, abgerufen 25. Mai, 2012.
  23. ^ "Die kurze Geschichte der GCC -Entwicklung". www.softpanorama.org. Abgerufen 24. Januar, 2021.
  24. ^ "Geschichte - GCC Wiki". gcc.gnu.org. Abgerufen 28. September, 2020.
  25. ^ "GCC -Lenkungsausschuss - GNU -Projekt". gcc.gnu.org.
  26. ^ "Patch] Chill entfernen". gcc.gnu.org. Abgerufen 29. Juli, 2010.
  27. ^ "Diagramm der Features von Forran 2003, die von GNU Forran unterstützt werden". GNU. Abgerufen 25. Juni, 2009.
  28. ^ "Diagramm der Features 2008 -Funktionen von GNU Forran". GNU. Abgerufen 25. Juni, 2009.
  29. ^ "GCC 4.8 Release -Serie - Änderungen, neue Funktionen und Korrekturen - GNU -Projekt". gcc.gnu.org.
  30. ^ "GCC 5 Release -Serie - Änderungen, neue Funktionen und Korrekturen". gcc.gnu.org.
  31. ^ "GCC 8 Release -Serie - Änderungen, neue Funktionen und Korrekturen". gcc.gnu.org.
  32. ^ "Symbian GCC -Verbesserungsprojekt". Abgerufen 8. November, 2007.
  33. ^ "Support -Pakete für Linux -Board". Archiviert von das Original am 7. Juni 2011. Abgerufen 24. Januar, 2021.
  34. ^ "GCC als Cross-Compiler einrichten". PS2Stuff. 8. Juni 2002. Archiviert von das Original am 11. Dezember 2008. Abgerufen 12. Dezember, 2008.
  35. ^ "CompileFarm - GCC Wiki". gcc.gnu.org.
  36. ^ "SH4 G ++ - Handbuch". Archiviert von das Original Am 20. Dezember 2002. Abgerufen 12. Dezember, 2008.
  37. ^ "Linux -Informationsprojekt". Linfo. Abgerufen 27. April, 2010. Das GCC wurde auf mehr als 60 Plattformen portiert (d. H. Um zu laufen), was mehr als für jeden anderen Compiler ist.
  38. ^ "Die D -Sprache Front -End hat sich schließlich zu GCC 9 zusammengeschlossen - Phoronix". Phoronix.com. Abgerufen 19. Januar, 2021.
  39. ^ a b "GCC Frontenden". gnu.org. Abgerufen 25. November, 2011.
  40. ^ "GCC 5 Release -Serie - Änderungen, neue Funktionen und Korrekturen - GNU -Projekt". gcc.gnu.org.
  41. ^ "GCC 7 Release -Serie". gnu.org. Abgerufen 20. März, 2018.
  42. ^ "C ++ Standards unterstützen in GCC". Abgerufen 17. Mai, 2021.
  43. ^ "GCC UPC (GCC Unified Parallel C)". Intrepid Technology, Inc. 20. Februar 2006. Abgerufen 11. März, 2009.
  44. ^ Spengler, Brad (12. Januar 2021). "Open Source Security, Inc. kündigt die Finanzierung des GCC-Front-Ends für Rust an.".
  45. ^ "Sicherheitsfunktionen: Kompilieren Sie Zeitpufferprüfungen (Fortify_Source)". fedoraproject.org. Abgerufen 11. März, 2009.
  46. ^ "Sprachen, die verwendet werden, um GCC zu machen".
  47. ^ "GCC -Interna". Gcc.org. Abgerufen 1. März, 2010.
  48. ^ "Voraussetzungen für GCC - GNU -Projekt". gcc.gnu.org. Abgerufen 5. September, 2021.
  49. ^ "GCC erlaubt C ++ - bis zu einem gewissen Grad". Das h. 1. Juni 2010.
  50. ^ "Re: Bemühungen, mehr Benutzer anzulocken?". lists.gnu.org.
  51. ^ "GCC 4.8 Release -Serie: Änderungen, neue Funktionen und Fixes". Abgerufen 4. Oktober, 2013.
  52. ^ "Bootstrap: Aktualisieren Sie die Anforderung auf C ++ 11". GitHub. Abgerufen 18. Mai, 2020.
  53. ^ "GCC 3.4 Release -Serie - Änderungen, neue Funktionen und Korrekturen - GNU -Projekt". gcc.gnu.org.
  54. ^ "GCC 4.1 Release -Serie - Änderungen, neue Funktionen und Korrekturen - GNU -Projekt". gcc.gnu.org.
  55. ^ "Generic (GNU Compiler Collection (GCC) Interna)". gcc.gnu.org.
  56. ^ "Gimple (GNU Compiler Collection (GCC) Interna)". gcc.gnu.org.
  57. ^ "McCat". Archiviert vom Original am 12. August 2004. Abgerufen 14. September, 2017.{{}}: CS1 Wartung: Bot: Original -URL -Status unbekannt (Link)
  58. ^ "Laurie Hendrens Homepage". www.sable.mcgill.ca.
  59. ^ Novillo, Diego (Dezember 2004). "Von Quelle zu Binär: Das Innenleben von GCC". Red Hat Magazine. Archiviert von das Original am 1. April 2009.
  60. ^ "Installieren von GCC: Gebäude - GNU -Projekt". gcc.gnu.org.
  61. ^ "Die GNU C ++ -Bibliothek". GNU -Projekt. Abgerufen 21. Februar, 2021.
  62. ^ "Lizenz". GNU -Projekt. Abgerufen 21. Februar, 2021.
  63. ^ "Plugins". GCC Online -Dokumentation. Abgerufen 8. Juli, 2013.
  64. ^ Starynkevitch, Basile. "GCC -Plugins durch das Schmelzbeispiel" (PDF). Abgerufen 10. April, 2014.
  65. ^ "Über GCC schmelzen". Archiviert Aus dem Original am 4. Juli 2013. Abgerufen 8. Juli, 2013.
  66. ^ "GCC Unplugged [lwn.net]". lwn.net.
  67. ^ "TransactionalMemory - GCC Wiki". gcc.gnu.org.
  68. ^ "Lewis Hyatt - [Patch] wwwdocs: Dokumentenunterstützung für erweiterte Kennungen, die zu GCC hinzugefügt wurden". gcc.gnu.org. Abgerufen 27. März, 2020.
  69. ^ "Empfehlungen für erweiterte Identifikatorzeichen für C und C ++". www.openstd.org. Abgerufen 27. März, 2020.
  70. ^ "C -Erweiterungen (unter Verwendung der GNU Compiler Collection (GCC))". gcc.gnu.org. Abgerufen 12. Januar, 2022.
  71. ^ "Typof - Verwenden der GNU Compiler Collection (GCC)". gcc.gnu.org. Abgerufen 12. Januar, 2022.
  72. ^ "Optionszusammenfassung (mit der GNU Compiler Collection (GCC))". gcc.gnu.org. Abgerufen 21. August, 2020.
  73. ^ "Hexagon Project Wiki".
  74. ^ "Google Code Archiv - Langzeitspeicher für Google Code -Projekthosting". code.google.com.
  75. ^ "Der GNU -Compiler für die Java -Programmiersprache". Archiviert von das Original am 9. Mai 2007. Abgerufen 22. April, 2010.
  76. ^ Graphing -Taschenrechner#Programmierung
  77. ^ "Verwenden der GNU -Compiler -Sammlung". gnu.org. Abgerufen 5. November, 2019.
  78. ^ "GCC -Laufzeitausnahme". FSF. Abgerufen 10. April, 2014.

Weitere Lektüre

Externe Links

Offiziell

Sonstiges