GNU Compiler Collection (yleensä GCC) on GNU-projektin kehittämä kääntäjien kokoelma. Se on Free Software Foundationin vapaata ohjelmistoa, ja julkaistu GNU GPL:n ja osin LGPL:n alaisuudessa. GCC on GNUn kehitysympäristön tärkein osa ja vapaiden Unixin kaltaisten käyttöjärjestelmien vakiokääntäjä ja usein hyödynnetty myös kaupallisten kehitysympäristöjen kanssa.
GCC:n alkuperäinen nimi oli GNU C Compiler ja se osasi kääntää vain C-kieltä. Nyttemmin GCC osaa kääntää myös C++, Fortran, Ada, Objective-C, Go ja D -kieliä.[3][4]Java-kääntäjä on poistettu GCC:stä versiosta 7 alkaen.[5] Varhainen tuki Rust-kielelle on lisätty joulukuussa 2022, mutta tuki ei ole vielä täysin valmis GCC version 13 julkaisuun mennessä.[6][7]Modula-2-kielen tuki on lisätty kehitysversioon joulukuussa 2022.[8]
Richard Stallman aloitti GCC:n kehityksen. GCC oli aluksi kirjoitettu Pastel-kielellä, joka oli Pascal-kielen murre.[9] Jotta kääntäjä saatiin kevyemmäksi ja helpommin käännettäväksi Len Tower ja Stallman kirjoittivat sen uudelleen C-kielellä.[9][10] Ensimmäinen beetaversio julkaistiin 22. maaliskuuta 1987 ja 1.0 julkaistiin 23. toukokuuta.[11][1] Ensimmäinen C++:aa kääntänyt versio, 1.15.3, julkaistiin 18. joulukuuta samana vuonna.[1]
Vuonna 1997 ryhmä kehittäjiä, jotka kyllästyivät GCC:n hitaaseen kehitykseen ja suljettuun kehitysryhmään, muodosti projektin nimeltä EGCS (Experimental/Enhanced GNU Compiler System), joka otti mukaan ominaisuuksia eräistä GCC:n epävirallisista muunnoksista, kuten Fortran 77 -kääntäjän, IBM:n kehittämän Haifa-optimoijan ja Pentium-optimoinnin. Myöhemmin Free Software Foundation lopetti oman GCC 2.x:n kehityksensä ja EGCS:sta tuli virallinen GCC huhtikuussa 1999.[12]
GCC:n versio 4.2.1 oli viimeinen, joka julkaistiin GPL-lisenssin versiolla 2. Myöhemmät versiot käyttävät lisenssin versiota 3.[13]
GCC:n toteutusta on muutettu C-kielestä C++:n alijoukolle: tavoitteena on säilyttää yhteensopivuus edeltävään versioon sekä mahdollisuus kääntää GCC muilla kääntäjillä.[14]
Versio 7.1 lisää tuen C++17-standardin kaikille ominaisuuksille.[15] Versio 14.1 sisältää tukea useille C++26-standardin ominaisuuksille. Oletuksena GCC 14 käyttää vielä C++17-standardia.[16][17]
Tekniikka
GCC sisältää useita edustaosia (engl.front end) eri kieliä varten ja taustaosia (engl.back end) kohdesuorittimia varten.[18][19][20] GCC käyttää käännöksen aikana kolmea välikieltä: GENERIC, GIMPLE ja RTL. GENERIC on kielestä riippumaton muoto, jota jokainen edustaosa tuottaa. GCC:n välivaihe (engl.middle end) käsittelee GIMPLE-välikieltä, jossa jokaisessa ilmaisussa voi olla enintään kolme operandia. GIMPLE:stä tehdään SSA-muoto, johon sovelletaan ohjelman optimointia, ja muunnetaan takaisin GIMPLE-muotoon taustaosaa varten.[21][22][23][24][25] SSA-muoto (Static Single Assignment) on tarkoitettu tietovuon ja ohjelman ohjausvuon optimointiin.[26][27] RTL (Register Transfer Language) on lähellä varsinaista käskyä ja viimeinen välikieli käännöksessä.[28]
Kielituki
GCC sisältää tuen C-kielen eri standardiversioille sekä GNU-laajennuksille kieleen: versiossa 12.2.0 oletuksena käytössä on gnu17-versio (C18 GNU-laajennuksilla).[29]C90-versio on tuettu teknisien korjausten kanssa (Technical Corrigenda, 1994 ja 1996) ja vuonna 1995 julkaistu laajennettu versio (Amendment 1). C99-versio on tuettu teknisien korjauksien kanssa (2001, 2004 ja 2007). C11-versio on tuettu ja C17-version korjauksien kanssa.[29] Kääntäjässä on myös useita laajennuksia, jotka eivät ole mukana ISO-standardissa.[30]
GCC on kehitetty ja tukee pääasiallisesti POSIX-yhteensopivia alustoja (Linux ja muut Unixin kaltaiset käyttöjärjestelmät), mutta se on siirretty myös useille muille alustoille.[34][35]
GCC:stä on julkaistu epävirallisia käännöksiä muun muassa AIX, HP-UX, DOS (DJGPP), macOS ja Microsoft Windows (MinGW ja Cygwin) -alustoille.[36]Apple poisti vaiheittain kaikki GNU GPL -lisensoidut ohjelmistot OS X -käyttöjärjestelmästä (nykyisin nimellä macOS) ja on ottanut käyttöönsä LLVM:n.[37][38][39]