Helsingin yliopisto Tietojenkäsittelytieteen laitos
 

Tietojenkäsittelytieteen laitos

Tietoa laitoksesta:

 

C-ohjelmoinnin perustyökalut Unixissa

o C-käännöksen vaiheet
o gcc - Gnu C-kääntäjä
o make - ohjelmistojen ylläpitoon
o gdb - virheenjäljitykseen

Tämä on lyhyt johdatus tärkeimpien C-ohjelmoinnin perustyökalujen (gcc, make, gdb) käyttöön Helsingin yliopiston Unix-ympäristössä. Samat tai vastaavat työkalut ovat käytössä miltei kaikissa Unix-järjestelmissä.

Johdanto

GCC on C-kääntäjä, joka on asennettu kaikkiin paikallisiin UNIX-palvelimiin. Kaikissa on toinenkin C-kääntäjä, joka on osa kunkin UNIX-toimittajan systeemiohjelmistoa, mutta nämä ovat kaikki erilaisia. GCC on kaikkialla samanlainen, joten yksinkertaisuuden vuoksi käsittelemme vain sitä. Kaikki UNIXin C-kääntäjät ovat kuitenkin hyvin samankaltaisia, joten kaikki mitä ei erikseen ole GCC:n erityispiirteeksi mainittu pätee kaikkiin C-kääntäjiin.

Make on ohjelma, jolla käännösprosessia voi huomattavasti automatisoida. Sen käyttö helpottaa ohjelmointia jo aivan yksinkertaisissakin ohjelmissa poistamalla rutiinitoimenpiteitä.

GDB on virheenjäljitin, jolla suoritettavaa ohjelmaa voi tarkkailla ja ohjailla, ilman vaivalloisia tulostuslauseiden lisäyksiä ja uudelleen kääntämisiä.

Oletan lukijan jo hallitsevan UNIXin käytön perusteet, erityisesti tiedostojen ja hakemistojen käsittelyn (ls, cp, mv, rm, mkdir, cd, rmdir) sekä jonkin editorin käytön, jolla voi luoda tekstitiedostoja (emacs, gemacs, vi).

C-kieltäkään ei tästä ohjeesta opi. Ohje käsittelee vain kahta mainittua ohjelmointityökalua. Muitakin työkaluja on toki tarjolla yllinkyllin, muista C-kääntäjistä ja lähdekoodianalysaattoreista joidenkin editoreiden ohjelmakoodin kirjoittamista helpottaviin piirteisiin. Tarkoituksena on kuitenkin pitää tämä ohje lyhyenä ja ytimekkäänä ja opastaa aloittelevaa UNIX-ohjelmoijaa.

Tarkasteltavat työkalut on valittu tärkeytensä takia. Toisaalta jokin C-kääntäjä on kaiketi välttämätön C-ohjelmointia varten, toisaalta make on vähänkin isompia ohjelmia (esimerkiksi tietorakenteiden harjoitustyötä) laadittaessa oikein käytettynä ohjelmoinnin rutiinitoimenpiteitä erittäin paljon helpottava. Kaikki muut työkalut ovat vähemmän tärkeitä, joten keskityn vain näihin kahteen.

Tarkoituksenani ei kuitenkaan ole tutustuttaa kaikkiin kyseisten ohjelmien yksityiskohtiin. Päinvastoin, esitelen vain aivan perusteita, vaikkakin tarpeeksi esimerkiksi useimpien harjoitustöiden tekemiseen. Lisätietoja on toivottavasti helpompi kaivaa man-sivuilta ja muusta dokumentaatiosta tämän ohjeen lukemisen jälkeen.


C-käännöksen eri vaiheet

Tie C-kielisestä lähdekooditiedostosta ajettavaksi ohjelmaksi on pitempi ja hankalampi kuin ensikatsomalta luulisi. Tärkeimmät käyttäjälle näkyvät vaiheet on lueteltu seuraavassa.

  1. Esikääntäjä lukee otsikkotiedostot, laventaa makrot ja tulostaa raakaa C-koodia, jossa ei ole mitään esikääntäjän komentoja (#-alkuiset rivit).

  2. Kääntäjä lukee raakaa C-koodia ja tulostaa tekstimuotoista symbolista konekieltä.

  3. Assembleri lukee symbolista konekieltä ja tulostaa objektitiedoston, jossa on funktioiden lauseet konekielellä, sekä viitteitä vastaavan lähdekooditiedoston ulkopuolella oleviin globaaleihin muuttujiin ja funktioihin.

  4. Linkkeri kokoaa yhteen ohjelmoijan objektitiedostot (erillisinä tai kirjastoista), startup-modulin, C:n standardikirjaston, sekä mahdolliset ohjelmoijan luettelemat muut kirjastot ajettavaksi ohjelmaksi.
UNIX-kääntäjissä kaikki luetellut vaiheet ovat yleensä erillisiä ohjelmia, kun taas esimerkiksi MS-DOS-kääntäjät usein sisältävät lähes kaiken yhdessä ohjelmassa. Kummallekin ratkaisulle on hyviä syitä, UNIXissa tärkein syy erillisyyteen on, että näin eri ohjelmia voi käyttää myös muiden kääntäjien (ei välttämättä edes C-kääntäjien) kanssa.

Jotta käyttäjän ei kuitenkaan tarvitsisi käynnistää jokaista ohjelmaa erikseen tai huolehtia kaikista eri vaiheiden välisistä tilapäistiedostoista, käytetään eräänlaista käyttöliittymäohjelmaa, joka tekee kaiken automaattisesti. Tällöin tätä käyttöliittymäohjelmaa vain pyydetään esimerkiksi kääntämään jokin lähdetiedosto objektitiedostoksi, eikä eri ohjelmista tai niiden riippuvuuksista tarvitse välittää.

Hieman hämäävästi tämän käyttöliittymäohjelman nimi on gcc (perinteisesti cc, mutta keskitymme siis tässä ohjeessa vain GCC:hen), josta voisi päätellä, että tuo gcc-komento on se varsinainen C-kääntäjä. Näin ei kuitenkaan ole, vaan gcc|-komento on vain käyttöliittymä (komentorivipohjainen, ei vuorovaikutteinen). Tällä ei ole juuri käytännön merkitystä, mutta se voi auttaa ymmärtämään joitakin virhetilanteita.

Kaikkia erillisiä ohjelmia on toki mahdollista käyttää suoraankin, mutta se ei aina ole suoraviivaista, koska käyttöliittymäohjelmaan on keskitetty tietoa mm. oletusarvoista, jotka pitäisi suoraan käytettäessä kertoa erikseen.

o gcc o make o gdb


atk-apu@cs.helsinki.fi