Oversikt over GCC er utvidet samling rørledning, inkludert spesialiserte programmer som preprosessor, assembler og linker.
GCC følger 3-trinns arkitekturen er typisk for flerspråklig og multi-CPU-kompilatorer. Alle program trær er konvertert til en felles abstrakt representasjon på «midten slutten», slik at kode optimalisering og binære kode generasjon fasiliteter for å være felles for alle språk.,
GCC eksterne grensesnitt følger Unix-konvensjoner. Brukere påberope seg et språk-spesifikk driver programmet (gcc
for C, g++
for C++, etc.), som tolker kommando argumenter, kaller de faktiske kompilatoren, kjører assembler på utgang, og deretter eventuelt går linker til å produsere en komplett binære kjørbare.
Hver av språket kompilatorer er et eget program som leser kildekoden og utganger maskin kode. Alle har et felles indre struktur., Per-språk front end analyserer kildekoden i at språk og gir en abstrakt syntaks treet («treet» for kort).
Dette er, hvis det er nødvendig, konvertert til midten slutten innspill representasjon, kalt GENERISK form; midt slutten deretter gradvis forvandler programmet mot sin endelige form. Kompilatoren optimaliseringer og statisk kodeanalyse teknikker (for eksempel FORTIFY_SOURCE, en kompilator direktivet at forsøk på å oppdage noen bufferoverløp) er brukt for å kode., Disse fungerer på flere representasjoner, som for det meste arkitektur-uavhengig GIMPLE representasjon og arkitektur-avhengige RTL representasjon. Til slutt, maskin-kode er produsert ved hjelp av arkitektur-bestemt mønster matchende opprinnelig basert på en algoritme av Jack Davidson og Chris Fraser.
GCC ble skrevet først og fremst i C med unntak for deler av Ada front end. Distribusjonen inkluderer standard biblioteker for Ada, C++ og Java-koden som er for det meste skrevet i disse språkene., På noen plattformer, distribusjonen inkluderer også en lav-nivå runtime library, libgcc, skrevet i en kombinasjon av maskin-uavhengig C og prosessor-spesifikke maskin-kode, i hovedsak utviklet for å håndtere aritmetiske operasjoner som mål prosessor kan utføre direkte.
GCC bruker mange standard verktøy i sine bygg, inkludert Perl, Flex, Bison, og andre vanlige verktøy. I tillegg er det i dag krever ytterligere tre biblioteker til å være til stede for å bygge: GMP, MPC, og MPFR.
I Mai 2010, GCC styringsgruppen besluttet å tillate bruk av en C++ – kompilator for å kompilere GCC., Kompilatoren var ment å være skrevet det meste i C pluss et delsett av funksjonene fra C++. Spesielt, dette ble bestemt slik at GCC-utviklere kan bruke destructors og generiske funksjoner i C++.
I August 2012, GCC styringsgruppe annonsert at GCC nå bruker C++ som gjennomføringen av språk. Dette betyr at for å bygge GCC fra kilder, en C++ – kompilator er nødvendig som forstår ISO/IEC C++03 standard.,
Foran endsEdit
Foran ender består av forbehandling, leksikalsk analyse, syntaktisk analyse (analyse) og semantisk analyse. Mål av kompilatoren foran endene til å enten akseptere eller avvise kandidat programmer i henhold til språket grammatikk og semantikk, identifisere feil og håndtere gyldig programmet uttalelser til senere kompilatoren stadier. Dette eksempelet viser lexer og parser trinn utført for et enkelt program som er skrevet i C.,
Hver front end bruker en parser for å produsere abstrakt syntaks treet av en gitt kilde filen. På grunn av den syntaks treet abstraksjon, kildefilene av noen av de ulike språkene som støttes kan bli behandlet av den samme baksiden slutten. GCC startet med LALR parsere generert med Bison, men gradvis byttet til hånd-skrevet rekursiv-avstamning-parsere for C++ i 2004, og for C og Objective-C, i 2006. Som i 2021 alle foran ender bruke hånd-skrevet rekursiv-avstamning-parsere.
Til GCC-4.,0 treet representasjon av programmet ble ikke helt uavhengig av prosessoren blir målrettet. Betydningen av et tre var noe forskjellig for forskjellige språk front-ender, og front-ender kunne gi sine egne tre koder. Dette ble forenklet med innføringen av GENERISK og GIMPLE, to nye former for språk-uavhengig trær som ble introdusert med bruk av GCC 4.0. GENERISK er mer komplekse, basert på GCC-3.x Java front-end middels representasjon. GIMPLE er en forenklet GENERISK, der ulike konstruksjoner er senket til flere GIMPLE instruksjoner., C, C++ og Java front-ender produsere GENERISKE direkte i fronten. Andre foran ender i stedet har ulike mellomliggende representasjoner etter analysering og konvertere disse til GENERISK.
I begge tilfeller, den såkalte «gimplifier» konverterer deretter mer kompleks form til enklere SSA-basert GIMPLE skjema som er felles språk for et stort antall kraftig språk – og arkitektur-uavhengig global (funksjon omfang) optimaliseringer.,
GENERISK og GIMPLEEdit
GENERISK er et mellomliggende representasjon språk brukes som en «midt-end» mens kompilere kildekoden til kjørbare binærfiler. Et delsett, kalt GIMPLE, er målrettet av alle front-ender av GCC.
Den midtre fasen av GCC ikke alle av koden analyse og optimalisering, arbeider uavhengig av både den kompilerte språk og målet arkitektur, starter fra den GENERISK representasjon og utvide den til å registrere deg overføre språk (RTL)., GENERISK representasjon inneholder bare et delsett av imperativ programmering konstruksjoner optimalisert ved midten slutten.
I transformere kildekoden til GIMPLE, komplekse uttrykk er delt inn i en tre-adresse-kode ved bruk av midlertidige variabler. Denne representasjonen var inspirert av den ENKLE representasjon foreslått i McCAT kompilatoren av Laurie J. Hendren for å forenkle analyse og optimalisering av tvingende programmer.,
OptimizationEdit
Optimalisering kan skje under noen fase av samlingen, men mesteparten av optimaliseringer er utført etter syntaks og semantisk analyse av front end og før koden generasjon av back-end; dermed en felles, selv om noe motstridende, navn for denne delen av kompilatoren er «midt slutten.»
nøyaktig satt av GCC optimaliseringer varierer fra utgivelse til utgivelse som det utvikler seg, men inkluderer standard algoritmer, slik som loop optimalisering, hoppe threading, felles subexpression eliminering, instruksjon planlegging, og så videre., RTL optimaliseringer er av mindre betydning med tillegg av global SSA-basert optimaliseringer på GIMPLE trær, som RTL optimaliseringer har en mye mer begrenset omfang, og har mindre høyt nivå informasjon.
Noen av disse optimaliseringene utført på dette nivået inkluderer døde koden eliminering, delvis redundans eliminering, global verdi nummerering, spredte betinget konstant overføring, og skalar utskifting av aggregatene. Utvalg avhengighet basert optimaliseringer som automatisk vectorization og automatisk parallelization er også utført. Profil-guidet optimalisering er også mulig.,
Tilbake endEdit
GCC back-end er delvis angitt av preprosessor makroer og funksjoner som er spesifikke for et mål arkitektur, for eksempel til å definere sine endianness, word størrelse, og ringer konvensjoner., Den fremre delen av back-end bruker disse til å bestemme RTL generasjon, så selv om GCC er RTL nominelt prosessor-uavhengig, den første sekvensen av abstrakte instruksjoner er allerede tilpasset seg til målet. Når som helst, den faktiske RTL instruksjoner forming programmet representasjon må være i samsvar med maskinen beskrivelse av mål arkitektur.
maskinen beskrivelse filen inneholder RTL mønstre, sammen med operand begrensninger, og kodebiter til utgang monteringen., De begrensninger som indikerer at en bestemt RTL mønster kan bare bruke (for eksempel) til bestemte maskinvare-registre, eller (for eksempel) tillate umiddelbar operand forskyvninger av bare en begrenset størrelse (f.eks. 12, 16, 24, … bit forskyvninger, etc.). I løpet av RTL generasjon, begrensninger for gitt mål arkitektur er sjekket. For å utstede en gitt utdrag av RTL, må det passer ett (eller flere) av RTL mønstre i maskinen beskrivelse filen, og tilfredsstille begrensninger for dette mønsteret, ellers ville det være umulig å konvertere den siste RTL til maskinkode.,
Mot slutten av samlingen, gyldig RTL er redusert til en streng form som hver instruksjon refererer til virkelige maskinen registrerer og et mønster fra mål-maskin beskrivelse fil. Forming strenge RTL er en komplisert oppgave, og et viktig skritt er å registrere fordelingen, hvor real maskinvare registre valgt å erstatte det i første omgang gitt pseudo-registre. Dette er etterfulgt av en «oppfrisking» fase; noen pseudo-registre som ikke ble tilordnet en ekte maskinvare registrere er «smittet» for å stabelen, og RTL å utføre denne søle er generert., Likeledes, forskyvninger som er for store til å passe inn i en faktisk instruksjon må brytes opp og erstattes av RTL sekvenser som vil adlyde offset begrensninger.
I den siste fasen, maskinen koden er bygget ved å ringe en liten kodebit, som er forbundet med hver enkelt mønster, og til å generere reell instruksjoner fra mål instruction set, ved hjelp av den endelige registre, forskyvninger, og adresser valgt under laste fase. Montering-generasjon kodebiten kan være bare en streng, i hvilket tilfelle en enkel streng substitusjon av registre, forskyvninger, og/eller adresser til strengen er utført., Montering-generasjon kodebiten, kan også være en kort blokk med C-kode, utføre noen ekstra arbeid, men til slutt returnerer en streng som inneholder gyldig assembly-kode.
Andre featuresEdit
Noen av funksjonene i GCC inkluderer:
- Link-tid optimalisering optimaliserer over object file grenser direkte forbedre knyttet binære. Link-tid optimalisering baserer seg på en midlertidig fil som inneholder serialisering av noen Gimple representasjon inkludert i objekt-fil. Filen er generert ved siden av objektet kilde filen under utarbeidelse., Hver kilde samling genererer et separat objekt fil og link-tid helper-fil. Når objektet filer som er knyttet sammen, og kompilatoren er utført på nytt og bruker hjelpefiler for å optimalisere koden over separat innsamlet objekt-filer.
- Plugins kan utvide GCC kompilatoren direkte. Plugins som vil tillate at en lager kompilatoren til å være skreddersydd til spesifikke behov av ekstern kode inn som plugins. For eksempel, programtillegg kan legge til, erstatte eller fjerne midten-slutten passerer opererer på Gimple representasjoner., Flere GCC plugins har allerede blitt publisert, særlig GCC Python-plugin, som koblinger mot libpython, og gjør det mulig å påberope seg vilkårlig Python-skript fra innsiden av kompilatoren. Målet er å tillate GCC plugins for å være skrevet i Python. Den SMELTE plugg gir en høy-nivå Lisp-lignende språk for å utvide GCC.
- C++ transactional memory når du skriver med -fgnu-tm.
- Som av GCC 10, identifikatorer la UTF-8 (Unicode) koding, dvs. C kildekoden bruker UTF-8-koding som standard.