Yleiskatsaus GCC on laajennettu kokoelma putki, mukaan lukien erikoistunut ohjelmia, kuten preprocessor, assembler ja linkkeri.
GCC-seuraa 3-vaihe arkkitehtuuri tyypillinen monikielinen ja multi-CPU kääntäjät. Kaikki ohjelman puita muunnetaan yhteinen abstrakti edustus ”lähi-end”, jolloin koodi optimointi ja binary koodi sukupolven tilat on jaettu kaikilla kielillä.,
GCC: n ulkoinen rajapinta noudattaa Unix-yleissopimuksia. Käyttäjät vedota kieli-erityisiä driver ohjelman (gcc
C, g++
C++, jne.), joka tulkitsee komennon argumentteja, puhelut todellinen kääntäjä, juoksee kokoajan tuotos, ja sitten valinnaisesti toimii linkkeri tuottaa täydellinen binary executable.
jokainen kielen kääntäjä on erillinen ohjelma, jossa lukee lähdekoodia ja lähtee koneen koodia. Kaikilla on yhteinen sisäinen rakenne., Kielikohtainen etupää jäsentää kyseisen kielen lähdekoodia ja tuottaa abstraktin syntaksipuun (”puu” lyhyesti).
Nämä ovat, jos tarpeen, muuntaa lähi-end on tulo-edustus, nimeltään YLEINEN muoto; lähi-end sitten vähitellen muuttaa ohjelma kohti sen lopullista muotoa. Kääntäjä optimoinnit ja staattinen koodi analyysi tekniikoita (kuten FORTIFY_SOURCE, kääntäjä direktiivi, joka yrittää löytää joitakin puskurin ylivuotoja) sovelletaan koodi., Nämä työskennellä useita esityksiä, enimmäkseen arkkitehtuuri-riippumaton GIMPLE edustus-ja arkkitehtuuri-riippuvainen RTL edustus. Lopuksi koneen koodi on tuotettu arkkitehtuuri-erityisiä kaavoja alun perin perustuu algoritmiin Jack Davidson ja Chris Fraser.
GCC kirjoitettiin pääasiassa C lukuun ottamatta osia Ada: n etupäästä. Jakeluun kuuluvat Ada: n, C++: n ja Javan vakiokirjastot, joiden koodi on useimmiten kirjoitettu näillä kielillä., Joissakin ympäristöissä, jakelu sisältää myös matalan tason runtime library, libgcc, kirjoitettu yhdistelmä kone-riippumaton C ja prosessori-erityinen kone koodin, jonka tarkoituksena on ensisijaisesti käsitellä laskutoimituksia, että kohde prosessori voi suorittaa suoraan.
GCC käyttää rakenteessaan monia vakiotyökaluja, kuten Perliä, Flexiä, Bisonia ja muita yleisiä työkaluja. Lisäksi se edellyttää tällä hetkellä kolme ylimääräistä kirjastojen täytyy olla läsnä, jotta rakentaa: GMP -, MPC, ja MPFR.
toukokuussa 2010 GCC: n ohjauskomitea päätti sallia C++ – kääntäjän käytön GCC: n kokoamisessa., Kääntäjä oli tarkoitus kirjoittaa enimmäkseen C plus osajoukko ominaisuuksia C++. Erityisesti tämä päätettiin niin, että GCC: n kehittäjät voisivat käyttää C++: n Destructor-ja generics-ominaisuuksia.
elokuussa 2012 GCC: n ohjauskomitea ilmoitti, että GCC käyttää nyt C++: aa täytäntöönpanokielenään. Tämä tarkoittaa, että GCC: n rakentamiseksi lähteistä tarvitaan C++ – kääntäjä, joka ymmärtää ISO/IEC C++03-standardia.,
Edessä endsEdit
Edessä päät koostuvat esikäsittely, leksikaalinen analyysi syntaktinen analyysi (jäsennys) ja semanttinen analyysi. Tavoitteet compiler edessä päät ovat joko hyväksyä tai hylätä ehdokas ohjelmat mukaan kielen kielioppi ja semantiikka, tunnistaa virheet ja käsitellä voimassa program esityksiä myöhemmin compiler vaiheissa. Tämä esimerkki näyttää lexer ja jäsennin vaiheet suoritetaan yksinkertainen ohjelma kirjoitettu C.,
jokainen etupää käyttää jäsennintä tietyn lähdetiedoston abstraktin syntaksipuun tuottamiseen. Koska syntaksipuun abstraktio, lähde tiedostoja tahansa eri tuettuja kieliä voidaan käsitellä samalla takaisin lopussa. GCC alkoi käyttää LALR-jäsentimiä generoidaan Bison, mutta vähitellen siirtynyt käsin kirjoitettu rekursiivinen-laskeutuminen jäsentimiä C++ vuonna 2004, ja C-ja objective-C vuonna 2006. Vuodesta 2021 alkaen kaikissa etupäissä käytetään käsin kirjoitettuja rekursiivisia parsereita.
kunnes GCC 4.,0 ohjelman puuesitys ei ollut täysin riippumaton kohteena olevasta prosessorista. Puun merkitys oli hieman erilainen eri kielisten etupäiden osalta, ja etupäät saattoivat antaa omat puukoodinsa. Tätä yksinkertaistettiin ottamalla käyttöön geneerinen ja GIMPLE, kaksi uutta kielestä riippumatonta puuta, jotka otettiin käyttöön GCC 4.0: n myötä. Geneerinen on monimutkaisempi, joka perustuu GCC 3: een.x Java front Endin väliedustus. GIMPLE on yksinkertaistettu geneerinen, jossa erilaisia konstruktioita lasketaan useisiin GIMPLE-ohjeisiin., C -, C++ – ja Java – etupäät tuottavat geneerisiä suoraan etupäässä. Muissa etupäissä on sen sijaan erilaisia väli-representaatioita jäsentämisen jälkeen ja muuntaa nämä geneerisiksi.
molemmissa tapauksissa, niin sanottu ”gimplifier” sitten muuntaa tämän monimutkaisempi muoto osaksi yksinkertaisempi SSA-pohjainen GIMPLE muodossa, että on yhteinen kieli suuren määrän voimakas kieli – ja arkkitehtuuri-riippumaton maailmanlaajuinen (toiminnon laajuus) optimointeja.,
GENEERISTEN ja GIMPLEEdit
GENERIC on väli-edustus käytetty kieli, kuten ”lähi-end”, kun taas kääntäminen lähdekoodista suoritettavan binäärit. Gimple-niminen osajoukko on GCC: n kaikkien etupäiden kohteena.
lähi-vaiheessa GCC ei kaikki koodi analyysi ja optimointi, työskentelee itsenäisesti sekä käännetty kieli ja kohde-arkkitehtuuri, alkaen GENERIC edustus ja laajentaa sen register transfer language (RTL)., YLEINEN edustus sisältää vain osajoukko välttämätöntä ohjelmointi konstruktioita optimoitu lähi-end.
muuttaessaan lähdekoodia GIMPLEKSI kompleksiset lausekkeet jaetaan kolmen osoitteen koodiin väliaikaisten muuttujien avulla. Tämä esitys oli innoittamana YKSINKERTAINEN esitys, on ehdotettu McCAT compiler Laurie J. Hendren yksinkertaistaa analyysi ja optimointi välttämätöntä ohjelmia.,
OptimizationEdit
Optimointi voi esiintyä minkä tahansa vaiheen kokoaminen; kuitenkin, suurin osa optimointeja suoritetaan kun syntaksi-ja semanttinen analyysi etuosa ja ennen koodin generointi back end; siis yhteinen, vaikka hieman ristiriitainen, nimi tämän osa compiler on ”lähi-end.”
tarkka joukko GCC optimointeja vaihtelee julkaisu julkaisu, koska se kehittyy, mutta sisältää vakio algoritmeja, kuten silmukka optimointi, hypätä ketjuttaminen, yhteinen subexpression poistaminen, opetuksen ajoitus, ja niin edelleen., RTL-optimoinnit ovat vähemmän merkitystä lisäämällä global SSA-pohjainen optimointeja GIMPLE puita, kuten RTL optimointeja on paljon suppeampi, ja on vähemmän korkean tason tietoa.
Jotkut näistä optimointeja suoritetaan tällä tasolla kuuluu kuolleen koodin poistaminen, osittainen irtisanomisia poistaminen, globaali arvo numerointi, harva ehdollinen jatkuva eteneminen, ja skalaari korvaaminen aggregaatteja. Array riippuvuus perustuu optimointeja, kuten automaattinen vectorization ja automaattinen parallelization tehdään myös. Myös profiiliohjattu optimointi on mahdollista.,
back endEdit
GCC: n takapää on osittain määritelty preprocessor makrojen ja toimintoja tiettyyn kohde-arkkitehtuuri, esimerkiksi määritellä sen endianness, sana koko, ja kutsuvan yleissopimusten., Etuosa takaisin käyttötarkoitukset nämä auttaa päättämään RTL-sukupolvea, joten vaikka GCC: n RTL on nimellisesti prosessori-riippumattomia, alkuperäisen järjestyksen abstrakteja ohjeita on jo mukautettu kohde. Milloin tahansa, todellinen RTL-ohjeet, jotka muodostavat ohjelman edustus on noudatettava koneen kuvaus kohde-arkkitehtuuri.
koneen kuvaustiedosto sisältää RTL-kuvioita sekä operand-rajoitteita ja koodinpätkiä lopullisen kokoonpanon ulostuloon., Rajoitukset osoittavat, että erityisesti RTL mallia voi soveltaa vain (esimerkiksi) tiettyjen laitteisto rekisteröi, tai (esimerkiksi) anna välitön operandi siirtymät vain rajoitettu koko (esim. 12, 16, 24, … bit offsets, jne.). RTL-sukupolven aikana tarkastetaan tietyn kohdearkkitehtuurin rajoitukset. Jotta kysymys koska pätkä RTL, sen on vastattava yksi (tai enemmän) RTL kuvioita koneen kuvaus tiedoston, ja tyydyttää rajoitteita, että malli; muuten, se olisi mahdotonta muuntaa lopullinen RTL konekielelle.,
loppua Kohti kokoaminen, voimassa oleva RTL on vähennetty tiukka muodossa, jossa jokainen ohje viittaa todellinen kone rekisterit ja kuvio kohde on koneen kuvaus tiedosto. Muodostaen tiukan RTL on monimutkainen tehtävä, tärkeä askel on rekisteröidä jako, jossa todellinen laitteisto rekisterit ovat päättäneet korvata alun perin määritetty pseudo-rekisterit. Tätä seuraa ”uudelleenlastaus” vaihe; kaikki pseudo-rekisterit, joita ei ole määritetty todellinen laitteisto rekisteröi ovat ’vuotaneet’ pino, ja RTL suorittaa tämän valuu syntyy., Samoin siirtymät, jotka ovat liian suuria mahtuakseen osaksi varsinaista opetusta on hajonnut ja korvattu RTL sekvenssit, jotka tottelevat offset rajoitteet.
viimeisessä vaiheessa, koneen koodi on rakennettu soittamalla pieni koodinpätkä, joka liittyy kunkin malli, luoda todellinen ohjeet kohde-käskykanta, käyttäen lopullinen rekisterit, siirtymät, ja osoitteet valittu aikana reload-vaihe. Assembly-generation snippet voi olla vain merkkijono, jolloin suoritetaan yksinkertainen merkkijono korvaaminen rekisterit, offsets, ja/tai osoitteet merkkijono., Kokoonpano-sukupolven pätkä voi olla myös lyhyt lohko C-koodia, joka suorittaa jotakin ylimääräistä työtä, mutta lopulta paluu merkkijono, joka sisältää voimassa assembly-koodi.
Muut featuresEdit
Jotkut ominaisuudet GCC sisältää:
- Link-ajan optimointi optimoi koko object file rajat suoraan parantaa linkitetty binary. Linkki-ajan optimointi perustuu väli-tiedosto, joka sisältää serialization joitakin Gimple edustus mukana kohde-tiedosto. Tiedosto syntyy objektitiedoston rinnalla lähdekoodikokoelman aikana., Jokainen lähdekokoelma luo erillisen objektitiedoston ja link-time helper-tiedoston. Kun objektitiedostot linkitetään, kääntäjä suoritetaan uudelleen ja käyttää helper-tiedostoja optimoimaan koodin erikseen koottujen objektitiedostojen kautta.
- liitännäiset voivat laajentaa GCC-kääntäjää suoraan. Liitännäiset mahdollistavat varastokompilerin räätälöinnin erityistarpeisiin liitännäisinä ladatulla ulkoisella koodilla. Esimerkiksi plugins voi lisätä, korvata tai jopa poistaa Middle-end kulkee toimivat Gimple edustustot., Useita GCC-liitännäisiä on jo julkaistu, erityisesti GCC Python-liitännäinen, joka linkittyy libpythoniin, ja mahdollistaa mielivaltaisten Python-skriptien käyttämisen kääntäjän sisältä. Tavoitteena on, että GCC-liitännäiset voidaan kirjoittaa Pythonissa. MELT plugin tarjoaa korkean tason Lisp-kaltainen kieli laajentaa GCC.
- C++ transaktiomuisti koottaessa-fgnu-tm.
- GCC 10: n mukaan tunnisteet mahdollistavat UTF-8 (Unicode)-koodauksen eli C-lähdekoodi käyttää oletuksena UTF-8-koodausta.