Ohjelmien analysointi Ohjelmien kuvaaminen kaavioilla ohjelmien ymmärtäminen kaavioiden avulla kaavioiden tuottaminen ohjelmasta Erilaisia kaaviotyyppejä: ER-kaaviot, tilakaaviot, UML-kaaviot tietohakemisto vuokaaviot (tarkemmin) Vuoanalyysi Ohjelma-analyysi Viipalointi TTY Ohjelmistotekniikka 1 ER-kaaviot Kirjasto N 1 asiakas omistus M Lainaaja 1 N lainaus N Kirja TTY Ohjelmistotekniikka 2 1
Kirja varataan Merkitse varatuksi Ei varauksia Merkitse saapuneeksi Poistettu Tilakaaviot Kirja lainataan Merkitse lainatuksi Huonokuntoinen Poista Lainaushyllyssä Palautustiskillä Ota käsiteltäväksi On varauksia Ilmoita saapumisesta Lainassa Merkitse lainatuksi Varattujen hyllyssä TTY Ohjelmistotekniikka 3 UML-kaaviot (luokkakaavio) Aineisto hankintapäivä hinta kopiomäärä hanki ( ) luetteloi ( ) lainaa ( ) Kirjasto Kirja kirjoittaja ISBN lainaa ( ) CD kesto lainaa ( ) Lehti vuosi numero lainaa ( ) TTY Ohjelmistotekniikka 4 2
UML-kaaviot (sekvenssikaavio) : Lainaaja : Luettelo : Aineisto : Asiakasrekisteri hae(aineisto) lainaa(asiakas) tarkista(asiakas) TTY Ohjelmistotekniikka 5 Tietohakemisto Sisältö: nimi tietoalkion, tietovaraston tai ulkoisen olion pääasiallinen nimi alias käyttökohta ja tapa tietoalkiota käyttävät prosessit käyttötapa (syötteenä, tulosteena, tietovarastona) sisällön kuvaus (käytetty notaatio) lisätietoja Nimi Puhelinnumero Alias Käyttökohta ja -tapa Kuvaus AssessAgainstSet-up (tuloste) DialPhone (syöte) puhelinnumero = ( suuntanumero ) + varsinainen numero suuntanumero = * nollalla alkava 2-3-numeroinen luku * varsinainen numero = * 6-8-numeroinen luku * TTY Ohjelmistotekniikka 6 3
Tieto- ja kontrollivuo Vuokaaviot flow graph liittyy kääntäjätekniikkaan käytetään esim. optimoinnissa flow chart (kulkukaavio) kontrollin kulku esitetään algoritmin tasolla flow diagram abstraktimpi esitys kuin edelliset käytetään ohjelmien suunnittelussa (takaisinmallinnuksessa) Tieto ja kontrolli voidaan esittää samassa kaaviossa TTY Ohjelmistotekniikka 7 Kääntäjiin liittyvät vuokaaviot Peruslohko (basic block) koostuu peräkkäisistä ohjelman lauseista Kontrollivuo ei saa haarautua kesken peruslohkon Peruslohkon voi aloittaa: ohjelman (lauselistan) 1. lause hypyn kohteena oleva lause hyppykäskyn jälkeen tuleva lause TTY Ohjelmistotekniikka 8 4
Peruslohkot prod := 0; i := 1; do begin prod := prod + a [ i ] * b [ i ]; i := i + 1; end while i <= 20 Optimointi TTY Ohjelmistotekniikka 9 Algoritmin esittäminen (kulkukaavio) S1 t E f S1 S2 S1 S2 t E f S1; S2 if E then S1 else S2 do S1 while E TTY Ohjelmistotekniikka 10 5
Merkinnät: Abstraktit tietovuokaaviot Data 1 Muutos 1 Data 2 Muutos Data 5 2 Muutos 3 Data 6 Data 3 Data 4 Olio 1 Olio 2 Tietovarasto Järjestelmän ulkoinen olio esim. syöte tai tuloste Muutos tai prosessi Tietovuo (tai tietovirta) Tietovarasto TTY Ohjelmistotekniikka 11 Esimerkki tietovuokaaviosta Lainaaja Kirjastokortti Kirjan viivakoodi Lue kortti Merkitse lainatuksi Kuitti Kirja Asiakastietokanta Aineistotietokanta TTY Ohjelmistotekniikka 12 6
Tietovuokaavion tarkentaminen Puheääni Puhelin- Kuultu puhe Soittaja Vastaaja Valittu numero soitto Puheääni Valittu numero Ääniaallon muuttaminen signaaliksi Näppäimistön elektroniikka Elektroninen signaali Taajuudet Puhelun kytkentä Elektroninen signaali Signaalin muuttaminen ääniaalloksi Kuultu puhe TTY Ohjelmistotekniikka 13 Tarkennuksen merkinnät A f B A f1 V W f2 f3 Y X f4 Z f5 Z1 f6 Z3 Z2 f7 B X Y f41 f42 1 y1 f43 f44 2 y2 f45 Z TTY Ohjelmistotekniikka 14 7
Vuoanalyysi (flow analysis) Ohjelman ajoaikaisten ominaisuuksien tutkiminen ajamatta ohjelmaa käytetään yksinkertaistettua, symbolista versiota ohjelman datasta Vaihtoehtoisia termejä: symbolinen ajaminen (symbolic eecution) abstrakti tulkinta (abstract interpretation) Tarkoitus: optimointi i ohjelmien todistaminen invarianttien (pysyväisväittämien) generointi ohjelman luotettavuuden parantaminen TTY Ohjelmistotekniikka 15 Esimerkki abstraktista tulkinnasta Yhdeksällä jaollisuus esim. onko luku 25236 jaollinen 9:llä? ratkaisu: 2 + 5 + 2 + 3 + 6 = 18 on jaollinen voidaan soveltaa tarkistuksissa? 123 * 457 + 76543 = 132654 6 7 7 4 3 TTY Ohjelmistotekniikka 16 8
Esimerkkejä vuoanalyysista: muutoksia koodin parantamiseksi Peräkkäinen koodi: lausekkeen toistuvan evaluoinnin eliminointi vakioiden/vakiolausekkeiden korvaaminen niiden arvoilla Silmukat: koodin siirtäminen silmukan ulkopuolelle kalliiden laskutoimitusten välttäminen Muita parannuksia: muuttujan korvaaminen toisella kuolleen koodin eliminointi Tehokkuus TTY Ohjelmistotekniikka 17 Esimerkki kalliiden laskutoimitusten välttämisestä i := 1; while i < 100 do a := i * 5; i = i + 1; od i := 1; t := 5; while i < 100 do a := t; i = i + 1; t := t + 5; od TTY Ohjelmistotekniikka 18 9
Koodin siirtäminen silmukan ulkopuolelle 1 1 Laske A / B 2 Voidaanko siirtää? 2 3 B <- lauseke; Laske A/B Laske A / B 4 3 B <- lauseke; Laske A/B 4 5 A ja B eivät riipu silmukkalaskurista 5 TTY Ohjelmistotekniikka 19 Ohjelma-analyysi Lähdekoodin ja muiden dokumenttien tarkastelu (vrt. koodianalyysi) Analysointia tapahtuu neljällä tasolla: toteutustaso rakenteellinen taso toiminnallinen taso sovellusalueen taso staattinen analyysi dynaaminen analyysi TTY Ohjelmistotekniikka 20 10
Esimerkkejä ohjelmaanalyysista Staattinen analyysi Näytä sen aliohjelman runko, jota kutsutaan tietystä lauseesta. Näytä sen tyypin esittely, jota käytetään tietyn muuttujan esittelyssä. Etsi kaikki muuttujat, jotka ovat näkyviä tietyssä aliohjelmassa ja jotka ovat tiettyä tyyppiä. Dynaaminen analyysi Etsi kaikki lauseet, jotka suoritetaan tietyn muuttujan arvon tuottamiseksi. Etsi kaikki lauseet, jotka käyttävät tietyn muuttujan arvoa. Etsi kaikki muuttujat, joiden arvoa käytetään laskettaessa tietyn muuttujan arvo. TTY Ohjelmistotekniikka 21 Esimerkkejä ohjelmakaavioista Kutsukaavio tai kutsuviittauskaavio (call graph) Yhteenvetokaavio (program summary graph) Aliohjelmien välinen vuokaavio (interprocedural flow graph) Riippuvuuskaavio (system dependency graph) TTY Ohjelmistotekniikka 22 11
( define ( square a ) ( * a a ) ) ( define ( fun y ) ( + ( square ) ( square y ) ) ) Kutsukaavio (kontrollin kulku)?(f fun 35) = 34 fun square square TTY Ohjelmistotekniikka 23 ( define ( square a ) ( * a a ) ) ( define ( fun y ) ( + ( square ) ( square y ) ) )?(f fun 35) = 34 arg1 = 3 arg2 = 5 Tietovuon lisääminen paluuarvo = 9 fun arg = 3 arg = 5 paluuarvo = 25 square paluuarvo = 34 square TTY Ohjelmistotekniikka 24 12
Toinen esimerkki kutsukaaviosta 1 program Sums 2 read ( n ); 3 i := 1; 4 while ( i <= n ) 5 sum := 0; 6 Acc ( sum, i ); 7 write ( sum, i ); 8 i := i + 1; 9 end while 10 end. Sums 11 procedure Acc (, y ) ref, y 12 j := 1; 13 while ( j <= y ) 14 Add (, j ); 15 Inc ( j ); 16 end while 17 return sum, i Acc 18 procedure Inc ( ) ref 19 Add (, 1 ); 20 return 21 procedure Add ( a, b ) ref a; value b 22 a := a + b; 23 return j, j Inc Add, 1 TTY Ohjelmistotekniikka 25 Sums sum i Acc y j Inc Add a Yhteenvetokaavio todelliset parametrit muodolliset parametrit sum i y j a parametri- liitäntä parametrien tietovuo TTY Ohjelmistotekniikka 26 13
Sums Acc { U 6 } sum i { U 2, U 3, U 5 } y j Inc { U 6 } { U 6 } Add Aliohjelmien välinen vuokaavio a sum i j { U 6 } y a { U 2, U 3 } { U 1, U 4, U 6 } { U 1 } { U 4, U 6 } Käyttöjoukot (use sets): U 1 : sum rivillä 7 U 2: i rivillä 7 U 3 : i rivillä 8 U 4 : j rivillä 13 U 5 : y rivillä 13 U 6 : a rivillä 22 TTY Ohjelmistotekniikka 27 Riippuvuuskaavio Acc y j := 1 while j <= y y j Add j j Inc j Inc Add 1 Add a b a := a + b a b TTY Ohjelmistotekniikka 28 14
Viipalointi (slicing) Ohjelmien ymmärtäminen Virheiden etsintä Ohjelmien rinnakkaistaminen Viipaleen laskenta perustuu ohjelman tieto- ja kontrollivuohon viipaleen lauseet eivät välttämättä peräkkäisiä Viipale määräytyy ohjelmakohdan (rivin) ja tarkasteltavien muuttujien perusteella Alkuperäinen määritelmä: viipale sisältää lauseet, jotka voivat vaikuttaa seuraus tietyn muuttujan arvoon tietyssä ohjelmakohdassa viipaleen ajaminen tuottaa tälle muuttujalle samat arvot kuin alkuperäisen ohjelman ajaminenkin TTY Ohjelmistotekniikka 29 Esimerkkiohjelma 1 Esimerkki (1) (1) begin (2) read (, y ); (3) total := 0.0; (4) sum := 0.0; (5) if <= 1 then (6) sum := y; (7) else begin (8) read ( ); (9) total := * y; (10) end; (11) write ( total, sum ); (12) end; Viipale kriteerin <12, { }> perusteella: (1) begin (2) read (, y ); (5) if <= 1 then (7) else begin (8) read ( ); (10) end; (12) end; TTY Ohjelmistotekniikka 30 15
Esimerkkiohjelma 1 Esimerkki (2) (1) begin (2) read (, y ); (3) total := 0.0; (4) sum := 0.0; (5) if <= 1 then (6) sum := y; (7) else begin (8) read ( ); (9) total := * y; (10) end; (11) write ( total, sum ); (12) end; Viipale kriteerin <12, { }> perusteella: (1) begin (2) read (, y ); (12) end; TTY Ohjelmistotekniikka 31 Esimerkkiohjelma 1 Esimerkki (3) (1) begin (2) read (, y ); (3) total := 0.0; (4) sum := 0.0; (5) if <= 1 then (6) sum := y; (7) else begin (8) read ( ); (9) total := * y; (10) end; (11) write ( total, sum ); (12) end; Viipale kriteerin <12, { total }> perusteella: (1) begin (2) read (, y ); (3) total := 0.0; (5) if <= 1 then (7) else begin (9) total := * y; (10) end; (12) end; Rivi 11? TTY Ohjelmistotekniikka 32 16
Esimerkkiohjelma 2 begin (1) read ( ); (2) if ( < 0 ) then (3) y := f1 ( ); (4) := g1 ( ); else (5) if ( = 0 ) then (6) y := f2 ( ); (7) := g2 ( ); else (8) y := f3 ( ); (9) := g3 ( ); end if; end if; (10) write ( y ); (11) write ( ); end; Viipalointi ja ohjelman riippuvuuskaavio 1 2 3 4 5 datariippuvuudet kontrolliriippuvuudet 6 7 10 8 9 11 Viipale kriteerin <10, { y }> perusteella TTY Ohjelmistotekniikka 33 Viipaloinnin jaottelu (1) Alkuperäinen eli takautuva (backward) viipale sisältää sellaiset lauseet, jotka vaikuttavat muuttujan arvoon Etenevä (forward) viipale sisältää sellaiset lauseet, joihin muuttuja vaikuttaa (joissa viitataan muuttujaan) TTY Ohjelmistotekniikka 34 17
Etenevä viipalointi Esimerkkiohjelma 3 (1) read ( n ); (2) i := 2; (3) c := 0; (4) while i <= ( n div 2 ) do (5) if ( n mod i ) = 0 then (6) write ( i ); (7) c := c + 1; (8) fi; (9) i := i + 1; (10) od; (11) write ( c ); Etenevä viipale kriteerin <2, { c }> perusteella: (3) c := 0; (7) c := c + 1; (11) write ( c ); TTY Ohjelmistotekniikka 35 Viipaloinnin jaottelu (2) Alkuperäinen eli staattinen viipalointi perustuu käännösaikaiseen ohjelman tarkasteluun Dynaaminen viipalointi otetaan mukaan vain ne lauseet, jotka tulee suoritettua viipale sisältää lauseet, jotka vaikuttavat muuttujan arvoon tietyllä ohjelman suorituskerralla dynaamiselle viipaloinnille on hieman erilaisia määritelmiä TTY Ohjelmistotekniikka 36 18
Dynaaminen viipalointi (verrattuna staattiseen) Esimerkkiohjelma 3 (1) read ( n ); (2) i := 2; (3) c := 0; (4) while i <= ( n div 2 ) do (5) if ( n mod i ) = 0 then (6) write ( i ); (7) c := c + 1; (8) fi; (9) i := i + 1; (10) od; (11) write ( c ); Staattinen viipale kriteerin <11, { c } > perusteella: kaikki muut rivit paitsi rivi 6 Dynaaminen viipale kriteerin <11, { c } > perusteella syötearvolla n = 2: (3) c := 0; (11) write ( c ); TTY Ohjelmistotekniikka 37 Dynaamisen viipaloinnin erilaisia määritelmiä Määritelmä 1: osa-ohjelma, joka laskee tarkasteltavien muuttujien arvot tietyllä suorituskerralla Määritelmä 2: kokoelma lauseita, jotka vaikuttavat tarkasteltavien muuttujien arvoihin tietyllä suorituskerralla ei välttämättä ajettava osa-ohjelma TTY Ohjelmistotekniikka 38 19
Määritelmien ero Esimerkkiohjelma 4 (1) i := 0; (2) while i < 10 do (3) if i = 0 then (4) h := 10; (5) i := i + 1; (6) od; (7) write ( h ); Dynaaminen viipale kriteerin < 7, { h } > perusteella: 1. määritelmän mukaan: kaikki rivit 2. määritelmän mukaan: kaikki muut rivit paitsi rivi 5 (7) write ( h ); kaikki muut rivit paitsi rivi 5 TTY Ohjelmistotekniikka 39 20