Uusi kirja: Perusteet ohjelmistojen symboliselle analyysille

Uusi kirja: Perusteet ohjelmistojen symboliselle analyysille
Kirja tilattavissa Amazon-kirjakaupasta (79 euroa)

perjantai 16. lokakuuta 2009

Muuttujien roolit tutkimuskohteena

Joensuun yliopistossa (Jorma Sajaniemi) on kehitetty ohjelmoinnin opiskelua tukemaan käsitteistö, jonka avulla tietokoneohjelman koodissa olevia muuttujia voidaan jakaa luokkiin sen mukaan mitä yhteisiä piirteitä niiden käytöllä näyttäisi olevan. Näin on alettu puhumaan muuttujien rooleista ja näistä on muutamia julkaisujakin olemassa. Näkisin kuitenkin, että tuo luokittelu on tehty alkujaan proseduraalisille kielille, kuten Pascalille, mutta ei olekaan itsestään selvää, että sama periaate soveltuisi myös uusille oliokielille, vaikka aika monissa artikkeleissa, väitöskirjahankkeissa ja diplomityöhankkeissa puhutaan oliokielissä esiintyvien muuttujien rooleista.

Oliomaisen koodin piirteet
Burkhardt, Wiedenbeck ja kumppanit ovat esittäneet, että olio-ohjelmillle data-analyysin merkitys on huomattavasti suppeampi kuin proseduraaliseen aikaan. Sen takia heidän mielestään datojen ja muuttujien käyttäytymistä kannattaa tarkastella etupäässä metodien sisällä. Näin muuttujien vaikutusalue kapenee ohjelmissa, mikä on niiden laadun kannalta erittäin hyvä asia. Tämä poistaa muuttujien roolitukselta paineita ja muuttaa tutkimuksen tavoitteita kovastikin.

Jäljelle jääville muuttujille olennaisia tietoja ovat määrittely (def), sijoitukset (set) ja käytöt (ref). Tarvitsee lähinnä seurata avainmuuttujan käyttäytymistä kriittisillä logiikkapoluilla. Def-osassa kerrotaan muuttujan tyyppi. Usein se valitaan mahdollisimman tarkasti niin, että vain yksi tai pari käyttäytymismallia jää ko. muuttujalle. Boolean-tyyppistä muuttujaa ei voida käyttää muuta kuin lippuna, integer-tyyppinen muuttuja on yleensä laskuri. Jos tieto on float, sitä käytetään laskentaan ja nämä käytöt saadaan selville tutkimalla sivuvaikutukset (graafi).

Olio-koodin erikoisominaisuudet
Muutama aivan merkittävä ominaisuus oliokoodin  muuttujilla on, mikä muuttaa tutkimustarpeetkin eri kertaluokkaan:
  1. Olioviitteet ovat oliokoodin tärkein luokka ja rooli. Vain niiden kautta on laadukasta kehittää monipuolisia ohjelmistoja, sillä ei ole syytä käyttää globaaleja attribuutteja, jotka sallisivat oliokoodin tietojen sorkkimisen niiden ulkopuolelta.
  2. Luokkien ja olioiden sisällä oleville muuttujille luodaan yleensä, jos niitä tarvitseekaan ulkoa tarkastella, rajapinnat, getterit ja setterit, joilla tiedon haku ja muuttaminen onnistuvat. Niiden avulla ei ole mahdollista nähdä näiden muuttujien rooleja, vain tyyppi, sillä käyttö selviää vasta ko. luokan tai olion sisältöä tarkastelemalla.
  3. Oliokoodissa olioviitteitä tallennetaan usein säiliöihin (container), joita ovat vektorit, matriisit tai muut kehittyneet tietorakenteet. Samassa säiliössä saattaa olla hyvin monenlaisia olioita, aivan objektista lähtien. Muuttujien roolin käsittely ei pure näihin säiliöobjekteihin, sillä ei voida tietää minkälainen tieto säiliöstä milloinkin palautuu.

Roolien etsintä on kapea-alainen tutkimusaihe
Tutkimusaiheena roolien etsintä antaa vain pienen osan ohjelman ominaisuuksista ja se kertoo muuttujista vain vähän. Roolitus tutkii muuttujien semanttisen käytön, se tarkastelee muuttujaa siis behavioristisesti ymmärtämättä muuttujaa, sen tyyppiä tai sisältöä tai merkitystä.

Tärkeämpiä tietoja itse ohjelmasta luettuna ohjelman ymmärtämistarkoituksessa ovat ohjausvuo, algoritmisuus, tilakäyttäytyminen ja erilaiset oliomallit ovat tärkeämpiä.


Toiseksi, muuttujan piirteitä voidaan helposti lukea pelkästään olion tyypistä. Jos tyyppi voi kertoa, että kysymyksessä on lippu, olioviite, jopa TCP/IP-yhteys, auto tai lentokone. Muuttujan rooli ei kykene kertomaan siitä.


Olio-ohjelmissa muuttujat sijaitsevat vankasti metodien sisällä. Poikkeuksena ovat julkisiksi määritellyt luokan attribuutit, joista staattisia saisi olla vain mahdollisimman harvat. Siten valtaosa muuttujista toimii vain metodien sisällä. Toisaalta metodit suunnitellaan nykyisin sellaisiksi, että ne palauttavat vain yhden arvon (return) tai suorittavat muita aktivointeja, tekevät sivuvaikutuksia.


Sivuvaikutusten tunnistaminen on paljon tärkeämpää kuin muuttujan roolin tunnistaminen, sillä ilman niitä ei ohjelma tai paketti tai luokka voi toimia ulkomaailman kautta, ovathan IO-toiminnotkin sivuvaikutuksia.


Muuttujien roolien tarve logiikkaohjelmoinnissa
Prologissa (logiikkaohjelmointi) ei ole destruktiivista sijoitusta, joten muuttujalle voidaan antaa arvo vain kerran. Tällöin varsinaisia rooleja ei ole lainkaan, sillä kaikki muuttujat ovat rooliltaan ainoan arvon säilyttäjiä. Sen sijaan Prologissa käytetään rekursiossa paljon akkupari-tekniikkaa, missä kahdella muuttujalla on keskenään sellaiset roolit, että toinen kerää tiedot ja toinen palauttaa tuloksen. Sama voidaan tehdä funktiomuodossa siten, että tarvitaankin vain yksi arvo. Alla esimerkkinä kertoman laskenta:


kertoma(0)=1.
kertoma(1)=1.
kertoma(N) = kertoma(N-1)*N.

Voimakkaasti tyypitetyssä kielessä kuten Visual Prolog kannattaa määritellä muuttujat siten, että muuttujaa ei voida juurikaan käyttää väärin. Väärinkäyttö voidaan estää oikeilla tyyppivalinnoilla. Esimerkiksi charCount kertoo, että siihen on tallennettu merkkien määrä, charIndex on paikka merkkijonossa jne.



Soveltuvuudesta



Muuttujien roolien tutkimus on lähinnä akateemista tutkimusta, joka ei hyödytä teollisuutta, mutta mahdollistaa diplomitöiden ja gradujen suunnittelun. Opettamisen kehittämistä tuo aihe kuitenkin edistää jos oppilailla on muuten vaikeuksia ymmärtää muuttujien semanttista käyttöä.



Muutamia linkkejä:
Craig Bishop and Colin G. Johnson. Assessing Roles of Variables by Program Analysis.

Ei kommentteja: