Modulaarinen ohjelmointi

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

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

5. HelloWorld-ohjelma 5.1

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

1. Omat operaatiot 1.1

TIETORAKENTEET JA ALGORITMIT

Solidity älysopimus ohjelmointi. Sopimus suuntautunut ohjelmointi

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

5. HelloWorld-ohjelma 5.1

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

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

Tietueet. Tietueiden määrittely

ITKP102 Ohjelmointi 1 (6 op)

Olio-ohjelmointi Javalla

14. Hyvä ohjelmointitapa 14.1

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

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

ITKP102 Ohjelmointi 1 (6 op)

Kääntäjän virheilmoituksia

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

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

Ohjelmoinnin jatkokurssi, kurssikoe

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

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

Rakenteiset tietotyypit Moniulotteiset taulukot

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

Pakkauksen kokoaminen

C-ohjelmoinnin peruskurssi. Pasi Sarolahti

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

15. Ohjelmoinnin tekniikkaa 15.1

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

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

13. Hyvä ohjelmointitapa (osa 1) 13.1

Ohjelmointi 2 / 2010 Välikoe / 26.3

ELM GROUP 04. Teemu Laakso Henrik Talarmo

Apuja ohjelmointiin» Yleisiä virheitä

Ohjelmoinnin perusteet Y Python

Sisällys. 16. Lohkot. Lohkot. Lohkot

Tietorakenteet ja algoritmit

9. Periytyminen Javassa 9.1

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

Tietorakenteet ja algoritmit

Harjoitus 5 (viikko 48)

TIE Principles of Programming Languages CEYLON

9. Periytyminen Javassa 9.1

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

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

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

\+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

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

Laiteläheinen C-kieli osa 1 pva

Transkriptio:

C-ohjelmointi Modulaarinen ohjelmointi Viikko 6 1

Sisältö Modulaarisuus C:ssä Käännösyksikkö ja otsaketiedosto Makefile 2

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. 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 4

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 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> 6

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 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 8

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ää 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 10

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 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-moduuliin */ 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. 12

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. 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 14

Javassa ei ole globaaleja muuttujia! Globaalit muuttujat 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) 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 16

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 17

Vastaa Javan rajapintaa (interface) Otsaketiedosto Sisältää: funktioiden esittelyt (prototyypit) Makrot vakioiden määrittelyt (const) 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 18

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 cmain.c tekee objektitiedoston main.o gcc cmod1.c gcc cmod2.c => mod1.o => mod2.o gcc o ohjelma main.o mod1.o mod2.o linkittää objektitiedostot suoritettavaksi ohjelmaksi 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

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ä. 21

makefile:n laatiminen Eräs skriptikieli, kuten mm -Job Control Languages -Unix Shell -QuakeC, AWK, perl, gcc c main.c gcc c mod1.c gcc c mod2.c 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 # kommenttirivi #makefile 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 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 22

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 23

Modular programming is a life saver, you can save an immense amount of time, if you do it right 24