C-ohjelmointi, syksy Modulaarinen ohjelmointi. Luento C-ohjelmointi Syksy

Samankaltaiset tiedostot
Modulaarinen ohjelmointi

Modulaarinen ohjelmointi Kertaus osoittimista

Loppukurssin järjestelyt C:n edistyneet piirteet

Loppukurssin järjestelyt

4. Luokan testaus ja käyttö olion kautta 4.1

ITKP102 Ohjelmointi 1 (6 op)

Rajapinta (interface)

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä ja ulkopuolelta. Attribuuttien arvojen käsittely aksessoreilla. 4.2

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

TIETORAKENTEET JA ALGORITMIT

1. Omat operaatiot 1.1

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

5. HelloWorld-ohjelma 5.1

Osoitin ja viittaus C++:ssa

12 Mallit (Templates)

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 16.3

Tietorakenteet ja algoritmit

812347A Olio-ohjelmointi, 2015 syksy 2. vsk. X Poikkeusten käsittelystä

Tässä dokumentissa kuvataan Keimo-projektissa sovellettavia ohjelmointikäytäntöjä. Päivämäärä Projektiryhmä Keimo

C-kielessä taulukko on joukko peräkkäisiä muistipaikkoja, jotka kaikki pystyvät tallettamaan samaa tyyppiä olevaa tietoa.

Modulaarisessa ohjelmoinnissa jaetaan ohjelma osiin (moduuleihin), jotka ovat yksinkertaisia ja lyhyitä.

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Tietueet. Tietueiden määrittely

ITKP102 Ohjelmointi 1 (6 op)

Olio-ohjelmointi Javalla

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Sisällys. Yleistä attribuuteista. Näkyvyys luokan sisällä. Tiedonkätkentä. Aksessorit. 4.2

5. HelloWorld-ohjelma 5.1

ITKP102 Ohjelmointi 1 (6 op)

Rakenteiset tietotyypit Moniulotteiset taulukot

Kääntäjän virheilmoituksia

Pakkauksen kokoaminen

IDL - proseduurit. ATK tähtitieteessä. IDL - proseduurit

Ohjelmoinnin jatkokurssi, kurssikoe

C++ Kuva 1-1. C- ja C++ kielien perustana olevat kielet.

14. Hyvä ohjelmointitapa 14.1

ATK tähtitieteessä. Osa 3 - IDL proseduurit ja rakenteet. 18. syyskuuta 2014

Lohkot. if (ehto1) { if (ehto2) { lause 1;... lause n; } } else { lause 1;... lause m; } 15.3

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

13/20: Kierrätys kannattaa koodaamisessakin

TAMPEREEN TEKNILLINEN YLIOPISTO Digitaali- ja tietokonetekniikan laitos. Harjoitustyö 4: Cache, osa 2

Laiteläheinen C-kieli, mitä C-käännösprosessissa tapahtuu

15. Ohjelmoinnin tekniikkaa 15.1

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

ITKP102 Ohjelmointi 1 (6 op)

Concurrency - Rinnakkaisuus. Group: 9 Joni Laine Juho Vähätalo

815338A Ohjelmointikielten periaatteet Harjoitus 3 vastaukset

TT00AA Ohjelmoinnin jatko (TT10S1ECD)

11. oppitunti III. Viittaukset. Osa. Mikä on viittaus?

TIE PRINCIPLES OF PROGRAMMING LANGUAGES Eiffel-ohjelmointikieli

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

Sisällys. 15. Lohkot. Lohkot. Lohkot

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Ohjelmointi 2 / 2010 Välikoe / 26.3

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Apuja ohjelmointiin» Yleisiä virheitä

Sisällys. 16. Lohkot. Lohkot. Lohkot

Ohjelmoinnin perusteet Y Python

9. Periytyminen Javassa 9.1

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

AS C-ohjelmoinnin peruskurssi 2013: C-kieli käytännössä ja erot Pythoniin

Tietorakenteet ja algoritmit

TIE Principles of Programming Languages CEYLON

9. Periytyminen Javassa 9.1

Harjoitus 5 (viikko 48)

Sisällys. 12. Näppäimistöltä lukeminen. Yleistä. Yleistä

Luokassa määriteltävät jäsenet ovat pääasiassa tietojäseniä tai aliohjelmajäseniä. Luokan määrittelyyn liittyvät varatut sanat:

T Olio-ohjelmointi Osa 3: Luokka, muodostin ja hajotin, this-osoitin Jukka Jauhiainen OAMK Tekniikan yksikkö 2010

12. Näppäimistöltä lukeminen 12.1

15. Ohjelmoinnin tekniikkaa 15.1

PERL. TIE Principles of Programming Languages. Ryhmä 4: Joonas Lång & Jasmin Laitamäki

2 Konekieli, aliohjelmat, keskeytykset

Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö. Muistin käyttö C-ohjelmassa

Tietorakenteet ja algoritmit

13. Hyvä ohjelmointitapa (osa 1) 13.1

\+jokin merkki tarkoittaa erikoismerkkiä; \n = uusi rivi.

Tietorakenteet ja algoritmit

1. Olio-ohjelmointi 1.1

Toinen harjoitustyö. ASCII-grafiikkaa

Ohjelmiston testaus ja laatu. Ohjelmistotekniikka elinkaarimallit

Luento 4 Aliohjelmien toteutus

C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. C-ohjelma. Operaatioiden suoritusjärjestys

Moduli 5: Kehittyneitä piirteitä

8. Näppäimistöltä lukeminen 8.1

812341A Olio-ohjelmointi, IX Olioiden välisistä yhteyksistä

Merkkijono määritellään kuten muutkin taulukot, mutta tilaa on varattava yksi ylimääräinen paikka lopetusmerkille:

Ohjelmassa muuttujalla on nimi ja arvo. Kääntäjä ja linkkeri varaavat muistilohkon, jonne muuttujan arvo talletetaan.

C++11 lambdat: [](){} Matti Rintala

Olio-ohjelmointi: Luokkien toteuttaminen. Jukka Juslin

Tietorakenteet ja algoritmit syksy Laskuharjoitus 1

Harjoitustyö: virtuaalikone

Harjoitus 4 (viikko 47)

Peilaus pisteen ja suoran suhteen Pythonin Turtle moduulilla

13 Operaattoreiden ylimäärittelyjä

AU Automaatiotekniikka. Toimilohko FB

Transkriptio:

, syksy 2007 Modulaarinen ohjelmointi Luento 9 10.10.2007 Syksy 2007 1 Sisältö Modulaarisuus C:ssä Käännösyksikkö ja otsaketiedosto Makefile Syksy 2007 2 1

Ison ohjelman toteuttaminen Kokonaisuus on jaettava hallittaviin osiin Toiminnallisia kokonaisuuksia (Java: luokat) Syöttö ja tulostus Virheiden käsittely Tietyn toiminnan tai rajatun tehtävän toteuttaminen Osien väliset rajapinnat eli parametrit ja paluuarvot Selkeästi määriteltyjä Vähän riippuvuuksia eri osien välillä Moduularisuus on keino hallita monimutkaisuutta! Moduulit toteuttavat abstraktion, kapseloinnin ja informaation piiliottamisen. Syksy 2007 3 Modulaarisuuden hyödyt Jako osiin + selkeät ja yksinkertaiset rajapinnat => koko ohjelman rakenne selkeämmäksi Ohjelmisto voidaan toteuttaa projektityönä: eri henkilöt ohjelmoivat eri osat Testaus voidaan aloittaa hyvin varhaisessa vaiheessa Ylläpito helpottuu: muutokset vain tarvittaviin kohtiin eli joihinkin funktioihin Koodin uudelleenkäyttö: standardikirjastot, omat kirjastot Kerran ratkaistu ja koodattu, voidaan käyttää monta kertaa Syksy 2007 4 2

Modulaarinen ohjelmointi ja C-kieli C ei varsinaisesti tue modulaarista ohjelmointia (vertaa esim. Modula) C:ssa on piirteitä, joiden avulla ohjelman modulaarisuus voidaan toteuttaa funktiot ja niiden protyypit otsaketiedostot (header files) Näitä piirteitä sopivasti käyttämällä saadaan C:ssä toteutettua modulaarinen ohjelma tehokkaasti Toiminnon toteutus toiminnon käyttö Piilotetaan käyttäjältä tarkat ohjeet käyttämiseen Syksy 2007 5 C:n piirteitä modulaariseen ohjelmointiin funktiot Ohjelma jaetaan useaksi pienehköksi funktioksi, joista kukin suorittaa tietyn toimenpiteen ~ noin 20 riviä kommentteineen on sopiva funktion koko, sillä näkyy helposti kokonaan näytöllä Valmiit kirjastofunktiot: standardikirjaston funktiot tai omat kirjastofunktiot käytettävissä Pääohjelma main lähinnä koostuu funktiokutsuista Lisähierarkiaa: funktiot voivat kutsua toisia funktioita funktioiden esittelyt eli prototyypit Funktio on määriteltävä tai esiteltävä ennen käyttöä Kääntäjä voi tarkistaa oikean käytön otsaketiedostot Sisältävät tietoja, joita ohjelmat tarvitsevat voidakseen käyttää muualla määriteltyjä funktioita #include <stdio.h> Syksy 2007 6 3

Pienehkön ohjelman modulaarinen rakenne #include-määrittelyt kirjastofunktioiden liittämiseksi voivat sisältää toisia includeja vakiomäärittelyt, tyyppiesittelyt helpompi hallita: löytää ja muuttaa Ohjelman funktioiden prototyypit eli niiden esittely Näin määritellään ennen käyttöä Pääohjelma main (joka ohjelmassa ainakin yksi) ja sen funktiokutsut Ohjelman funktioiden määrittelyt Syksy 2007 7 Entä kun funktioita on hyvin paljon ja niitä toteuttavat eri projektiryhmät ja useat ihmiset? main Linux: ytimessä 2.4 miljoonaa koodiriviä; tästä 1.4 milj. riviä eri laitteiden ajureita varten 78 000 C-tiedostoa, tiedoston keskim. koko 273 riviä; Koko KJ:n koko n. 20-30 miljoona riviä sub1 sub2 sub3 sub4 subsub1 subsub2 subsub2 Standardikirjaston funktiot Ohjelmoijan oma funktiokirjasto Modulaarisuus funktioiden tasolla Syksy 2007 8 4

Isohko ohjelma tai projekti Yhteenkuuluvat funktiot omiksi tiedostoiksi eli käännösyksiköiksi => moduuli Linuxin koodi Kukin käännösyksikkö voidaan kääntää ja testata erikseen => objektimoduuli Ajettava ohjelma saadaan, kun erikseen käännetyt objektimoduulit linkitetään yhteen Erikseen kunkin moduulin lähdekooditiedosto ja otsaketiedosto => joustavuutta kääntämisessä Ei tarvitse kääntää turhaan objektimoduulin koodia Otsaketietojen liittäminen riittää Syksy 2007 9 Kooditiedostot muodostavat C:n moduulin C:n funktiot ovat globaaleja, kaikkialta ohjelmasta kutsuttavissa Eivät sellaisenaan yhdessä tiedostossa tarjoa riittävää kapselointia toteuttamisen, muuttamisen, kääntämisen ja ylläpidon joustavuutta Toteutuksen ja käytön erottava moduuli syntyy, kun kootaan joukko yhteenliittyviä funktioita samaan kooditiedostoon (jokunimi.c) = moduulin toteutus ja näiden funktioiden prototyypit ja muu muiden moduulien käyttöön tarkoitettu data otsaketiedostoon (jokunimi.h) = moduulin rajapinta Syksy 2007 10 5

Kapselointi: static - Määrittelee talletusluokkaa ja näkyvyyttä (scope) Paikalliset muuttujat Funktion paikallisille muuttujille varataan tilat pinosta. Ne ovat käytettävissä vain funktion suoritusajan. static-määrittely => vain funktion sisällä käytettävissä, mutta säilyttävät arvonsa käyttökerrasta toiseen (esim.käyttökertalaskuri) Globaalit muuttujat ja funktiot static-määrittely rajaa näkyvyyden siihen tiedostoon, jossa ne ovat määritelty Mahdollistaa datan piilottamisen Syksy 2007 11 Kapselointi: estä tiedon vuotaminen ulkopuolelle ~ Javan private Kapseloidaan moduulin muuttujia ja funktioita static => eivät ole käytettävissä moduulin ulkopuolella Hyvä käytäntö jotenkin erottaa nimestä tällaiset muuttujat ja funktiot funktiota edeltää static-määre static void e_append_(); /* kuuluu editor.h-tiedostoon */ Globaalia muuttujaa edeltää static-määre static int e_flag_ = 0; /* tämä samoin*/ static muuttaa sen, kuinka linkittäjä käsittelee muuttujaa Huom! C:ssä kapselointiyksikkönä on tiedosto! Javassa objekti. Syksy 2007 12 6

extern-määrittely Funktioiden esittelyssä oletusarvona => voidaan jättää pois Yhteiskäyttöiset muuttujat Harvoin todella tarpeen ja hyödyllisiä extern int myerrorno Linkittäjä: kaikki viittaukset kohdistuvat samaan muuttujaan, vaikka olisivat eri tiedostoissa Globaalin muuttujan static-määrittely =>vain samassa tiedostossa kaikki viittaukset kohdistuvat samaan muuttujaan. Toisen tiedoston viittaukset kohdistuvat toiseen muuttujaan. Syksy 2007 13 Vaikutus linkittäjän toimintaan Ohjelmassa voi olla useita samannimisiä muuttujia (esim. i,j) ja linkittäjän täytyy tietää, milloin kyseessä on viite yhteen ja samaan muuttujaan ja milloin taas eri muuttujiin muuttujien linkkiytymistapa (linkage) ulkoinen (external): ulommalla tasolla määritellyt Yhteiskäyttöisiä, usean tiedoston sisällä viittaavat aina yhteen ja samaan olioon ei mitään: funktion sisällä määritellyt Linkittäjän kannalta aina eri olioita sisäinen (internal): const-määritellyt muuttujat, rakenteiset tyypit (struct, union, enum) Yhden tiedoston sisällä viittavat aina samaan olioon, eri tiedostoissa eri olioihin static ja extern muuttavat linkkiytymistapaa static muuttaa ulkoisen sisäiseksi extern muuttaa ulkoiseksi Syksy 2007 14 7

Globaalit muuttujat Javassa ei ole globaaleja muuttujia! Ohjelmassa funktion ulkopuolella määritellyt muuttujat ovat globaaleja koko ohjelmassa käytettävissä määrittelynsä jälkeen elinikä sama kuin koko ohjelmalla alustetaan nollaksi C:ssä tulee käyttää hyvin harkiten ja pyrkiä välttämään käyttämistä Funktiokutsut eivät saa muuttaa globaaleja muuttujia Seuraa vaikeuksia: testaus, virheiden jäljitys, ylläpito Dokumentoitava huolellisesti Määriteltävä yhdessä käännösyksikössä ja liitettävä.h tiedostoon (extern int globalvar) Syksy 2007 15 Käännösmoduulit mod1.h Funktioiden koodit Mainohjelman koodi mod1.c mod2.h Moduulin funktioiden koodit mod2.c mod3.h Moduulin funktioiden koodit mod3.c Syksy 2007 16 8

Kooditiedosto (.c) Sisältää yhteenkuuluvien, jollakin tavoin samaan kokonaisuuteen liittyvien funktioiden koodin Kukin funktio suorittaa jonkun tietyn toiminnon esim. syöttötietojen käsittelyn tulostukset varsinaisen tietojen käsittelyn ja muokkaamisen: laskenta, lajittelu, jne virheidenkäsittelyn Jne Yhdessä kooditiedostossa main Muiden moduulien käyttöön tarkoitettu informaatio kootaan otsaketiedostoksi Pyritään pitämään suhteellisen pienenä Eri moduulit suhteellisen riippumattomiksi toisistaan Syksy 2007 17 Otsaketiedosto Sisältää: funktioiden esittelyt (prototyypit) Makrot vakioiden määrittelyt (const) Vastaa Javan rajapintaa (interface) Header files usually ONLY contain definitions of data types, function prototypes and C preprocessor commands. Dokumentoinnin: kaikki mitä käyttäjän tarvitsee tietää osatakseen käyttää Ei mitään pelkästään toteutukseen liittyvää esikääntäjä liittää otsaketiedoston moduuliin #include <stdio.h> standardikirjaston funktion prototyypit moduuliin #include oma.h Samassa hakemistossa olevan oman otsaketiedoston liittäminen Syksy 2007 18 9

makefile Ohjelmassa on useita moduuleja. Kukin moduuli eli käännösyksikkö omassa tiedostossaan, kirjastofunktiot omassa tiedostossaan Käännösyksiköt käännetään erikseen ja linkitetään sitten yhteen gcc c main.c tekee objektitiedoston main.o gcc c mod1.c => mod1.o gcc c mod2.c => mod2.o gcc o ohjelma main.o mod1.o mod2.o linkittää objektitiedostot suoritettavaksi ohjelmaksi Syksy 2007 19 /* main.c */ #include <stdio.h> #include mod1.h #include mod2.h int main(void) { mod1(); mod2(); return 1; } /* mod1.c */ #include <stdio.h> #include mod1.h void mod1(void){. puts( moduuli yksi );.. } /*mod1.h */ void mod1(void); /* mod2.c */ #include <stdio.h> #include mod2.h void mod2(void){. puts( moduuli kaksi );.. } /*mod2.h */ void mod2(void); gcc c main.c gcc c mod1.c gcc c mod2.c gcc o ohjelma main.o mod1.o mod2.o 10

Moduulien kääntäminen make Kääntämiskomennot ja ohjeet kirjoitetaan säännöiksi makefile tai Makefile nimiseen tiedostoon kohde: tarvittavat tiedostot komento1 komento2. komentoz Huom. Komentojen sisennykseen käytetään tabulaattorimerkkiä (tabulointia), ei välilyöntejä. Syksy 2007 21 gcc c main.c gcc c mod1.c gcc c mod2.c makefile:n laatiminen gcc o ohjelma main.o mod1.o mod2.o Makefile kirjoitetaan vain kerran, mutta sitä voidaan käyttää monta kertaa komennolla make käännetään vain ne tiedostot, joita on muutettu linkitetään uudelleen vain, jos jokin linkitettävistä objektitiedostoista on muuttunut #makefile # kommenttirivi CC = gcc ansi pedantic Wall ohjelma: main.o mod1.o mod2.o $(CC) o ohjelma main. mod1.o mod2.o mod1.o: mod1.c mod1.h $(CC) c mod1.c mod2.o: mod2.c mod2.h $(CC) c mod2.c main.o: main.c mod1.h mod2.h $(CC) c main.c Eräs skriptikieli, kuten mm http://www.cs.helsinki.fi/group/sqltr/makefile_ohje.html http://www.eng.hawaii.edu/tutor/make/index.html http://vertigo.hsrl.rutgers.edu/ug/make_help.html -Job Control Languages -Unix Shell -QuakeC, AWK, perl, Syksy 2007 22 11

riippuvuusgraafit Harjoitustyö.o.o.o.o main.o mod1.o mod2.o modz.o.c.h.c.h.c.h.c main.c mod1.h mod1.c mod2.h mod2.c modz.h modz.c Syksy 2007 23 Modular programming is a life saver, you can save an immense amount of time, if you do it right Syksy 2007 24 12