Kääntäminen on prosessi, jossa C-kielen lähdekoodi muunnetaan konekoodiksi. Koska C on keskitason kieli, se tarvitsee kääntäjän muuntaakseen sen suoritettavaksi koodiksi, jotta ohjelma voidaan suorittaa koneellamme.
C-ohjelma käy läpi seuraavat vaiheet kääntämisen aikana:

Kokoonpanoprosessi C:ssä
Kuinka käännetään ja ajetaan C-ohjelma?
Tarvitsemme ensin kääntäjän ja koodieditorin C-ohjelman kääntämiseen ja suorittamiseen. Alla oleva esimerkki on Ubuntu-kone, jossa on GCC-kääntäjä.
Vaihe 1: Luo C-lähdetiedosto
Luomme ensin C-ohjelman editorilla ja tallennamme tiedoston nimellä filename.c
muodosta yhteys Java-tietokantaan
$ vi filename.c>
Voimme kirjoittaa yksinkertaisen hello world -ohjelman ja tallentaa sen.
Vaihe 2: Kääntäminen GCC-kääntäjällä
Käytämme seuraavaa komentoa päätteessä kääntääksemme tiedostonimi.c-lähdetiedoston
java lajittelee taulukkoa
$ gcc filename.c –o filename>
Voimme välittää monia ohjeita GCC-kääntäjälle erilaisiin tehtäviin, kuten:
- Vaihtoehto -Wall ottaa käyttöön kaikki kääntäjän varoitusviestit. Tätä vaihtoehtoa suositellaan paremman koodin luomiseksi.
- Vaihtoehtoa -o käytetään määrittämään tulostiedoston nimi. Jos emme käytä tätä vaihtoehtoa, tulostetiedosto, jonka nimi on a.out, luodaan.
Jos C-ohjelmassamme ei ole virheitä, luodaan C-ohjelman suoritettava tiedosto.
Vaihe 3: Ohjelman suorittaminen
Kääntämisen jälkeen suoritettava tiedosto luodaan ja suoritamme luodun suoritettavan alla olevan komennon avulla.
$ ./filename>
Ohjelma suoritetaan ja tulos näytetään päätteessä.
Mitä kokoamisprosessissa tapahtuu?
Kääntäjä muuntaa C-ohjelman suoritettavaksi. C-ohjelmasta tulee suoritettavaksi neljä vaihetta:
- Esikäsittely kokoonpanon linkitys
Suorittamalla alla olevan komennon saamme kaikki nykyisen hakemiston välitiedostot suoritettavan tiedoston kanssa.
$gcc -Wall -save-temps filename.c –o filename>
Seuraava kuvakaappaus näyttää kaikki luodut välitiedostot.
java laskuri
Keskitason tiedostot
Katsotaan yksi kerrallaan, mitä nämä välitiedostot sisältävät.
kuinka monta nollaa 1 miljardissa
1. Esikäsittely
Tämä on ensimmäinen vaihe, jonka läpi lähdekoodi välitetään. Tämä vaihe sisältää:
- Kommenttien poisto
- Makron laajentaminen
- Mukana olevien tiedostojen laajennus.
- Ehdollinen kokoelma
Esikäsitelty tulos tallennetaan tiedostonimi.i . Katsotaanpa, mitä filename.i:n sisällä on: using $vi tiedostonimi.i
Yllä olevassa lähdössä lähdetiedosto on täynnä paljon ja paljon tietoa, mutta lopulta koodimme säilyy.
- printf sisältää nyt a + b:n sijaan add(a, b), koska makrot ovat laajentuneet.
- Kommentit on poistettu. #include puuttuu sen sijaan näemme paljon koodia. Joten otsikkotiedostoja on laajennettu ja sisällytetty lähdetiedostoomme.
2. Kokoaminen
Seuraava vaihe on kääntää tiedostonimi.i ja tuottaa; välikäännetty tulostiedosto tiedostonimi.s . Tämä tiedosto on kokoonpanotason ohjeissa. Katsotaanpa tätä tiedostoa käyttämällä $nano tiedostonimi.s terminaalin komento.
Kokoonpanokooditiedosto
Tilannekuva osoittaa, että se on assembly-kielellä, jota assembler ymmärtää.
3. Kokoaminen
Tässä vaiheessa tiedostonimi.s otetaan syötteeksi ja muunnetaan muotoon tiedostonimi.o kokoajan toimesta. Tämä tiedosto sisältää konetason ohjeet. Tässä vaiheessa vain olemassa oleva koodi muunnetaan konekieleksi, eikä funktiokutsuja kuten printf() ratkaista. Katsotaanpa tätä tiedostoa käyttämällä $vi tiedostonimi.o
linkitetty lista java
Binäärikoodi
4. Linkittäminen
Tämä on viimeinen vaihe, jossa kaikki funktiokutsujen linkittäminen niiden määritelmiin tehdään. Linker tietää, missä kaikki nämä toiminnot on toteutettu. Linker tekee myös lisätyötä, se lisää ohjelmaamme ylimääräistä koodia, jota tarvitaan ohjelman alkaessa ja päättyessä. Esimerkiksi ympäristön määrittämiseen, kuten komentoriviargumenttien välittämiseen, tarvitaan koodi. Tämä tehtävä voidaan helposti tarkistaa käyttämällä $koko tiedostonimi.o ja $size tiedostonimi . Näiden komentojen avulla tiedämme, kuinka tulostiedosto kasvaa objektitiedostosta suoritettavaksi tiedostoksi. Tämä johtuu ylimääräisestä koodista, jonka Linker lisää ohjelmaamme.
Huomautus: GCC tekee oletuksena dynaamista linkitystä, joten printf() linkitetään dynaamisesti yllä olevassa ohjelmassa. Katso tämä, tämä ja tämä saadaksesi lisätietoja staattisesta ja dynaamisesta linkityksestä.