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.

maanantai 12. lokakuuta 2009

Itseoppineita neroja

Koululaitoksen ja yliopistojärjestelmän tarpeellisuudesta ei tule kovin mairittelevaa kuvaa kun silloin tällöin tulee vastaan ihmisiä, jotka ovat omaksuneet tieteen periaatteet ja sisällön itse - osallistumatta alan koulutukseen.
Muutamia todella huimia tapauksia itseoppineista neroista tiedetään.

Giordano Bruno opetteli tähtitieteen ja ennusti maailmankaikkeuden



Tämä fysiikan ja tähtitieteen suuruus, Giordano Bruno poltettiin elävältä Kukkien torilla Rooman keskustassa helmikuun 16. vuonna 1600 (täällä lisää). Hänen rikoksenaan oli ajattelun harjoittaminen. Vuonna 1889, kun vapaa-ajattelijat ja järkevät uskovaiset pystyttivät hänelle patsaan tuolle samalle torille, jolla katolinen kirkko murhasi hänet, paavi Leo XIII tuomitsi heidät. Vuonna 1942 kardinaali Mercati väitti, että kirkko teki oikein, koska Bruno ansaitsi tulla surmatuksi. Vatikaani on sittemmin vaiennut asiasta.Nyt mietitään pitäisikö uuden paavin päästää Bruno vihdoin pannasta.

Alla muutamia lainauksia oheisesta viitteestä:
Bruno oli itseoppinut nero. Hänhän eli ennen Galileita. Hän väitti, että Kopernikus oli oikeassa - että maa kiersi aurinkoa. Hän jatkoi kuitenkin valovuosia tuon puolalaisen tähtitieteilijän ohi: meidän aurinkomme on vain läheinen tähti, hän väitti, ja miljoonilla tähdillä on planeettoja ympärillään juuri niin kuin meidän tähdellämme. Hän väitti, että tämä tähtien universumi on rajaton.

Näiden väitteiden vuoksi, ja koska hän esitti, että papeilla ei ollut oikeutta väkisin yrittää käännyttää epäuskoisia, Brunon entinen kirkko asetti hänet syytteeseen. Katolinen kirkko sulki hänet inkvisiition ylläpitämiin vankiloihin Roomassa ja Venetsiassa seitsemäksi vuodeksi. Amerikkalaista Starria muistuttava syyttäjä samoili Eurooppaa etsien hänen kirjoituksiaan. Hänelle tarjottiin vapautta, mikäli hän peräytyisi. Hän hymähti pelkälle ajatukselle, ja sanoi piispoille ja papeille, jotka tuomitsivat hänet kuolemaan: "Ehkäpä teidän pelkonne antaessanne tuomiota on suurempi kuin minun sitä ottaessani vastaan."

Vuosikymmeniä myöhemmin Galileo perääntyi, joten hänelle ei käynyt yhtä pahasti kuin Brunolle.
Srinivasa Ramanuja kehitti ja johti suuria osia matematiikasta aivan itse



Englantilainen matematiikan professori GH Hardy sai yllättävää postia Intiasta vv. 1913. Lähettäjänä oli nuori itseoppinut nero Srinivasa Ramanuja, joka oli johtanut suuria osia matematiikan postulaateista itsenäisesti. Siitä on lisää mm. tässä Solmu-lehdessä (sivusta 31 alkaen).

Poimintoja Wikistä:
Born and raised in Erode, Tamil Nadu, India, Ramanujan first encountered formal mathematics at age 10. He demonstrated a natural ability, and was given books on advanced trigonometry by S L Loney. He had mastered them by age 13, and even discovered theorems of his own. He demonstrated unusual mathematical skills at school, winning accolades and awards. By 17, Ramanujan conducted his own mathematical research on Bernoulli numbers and the Euler–Mascheroni constant. He received a scholarship to study at Government College in Kumbakonam, but lost it when he failed his non-mathematical coursework. He joined another college to pursue independent mathematical research, working as a clerk in the Accountant-General's office at the Madras Port Trust Office to support himself. In 1912–1913, he sent samples of his theorems to three academics at the University of Cambridge.
Ainoastaan Hardy suvaitsi lukea Ramanujanin kirjeen, mutta sen ansiosta hän pääsi perille siitä, että kaukainen lähettäjä on joko nero tai joku umpihullu tyyppi, joka tekee asioista pilaa. Kirje kuului kuulemma näin:
S. Ramanujan G.H. Hardylle, Madras 16. tammikuuta 1913:
”Hyvä herra,
pyydän esittäytyä Madrasin satamasäätiön tiliosaston virkailijana, joka ansaitsee vuodessa 20 puntaa. Olen nyt noin 23 vuoden ikäinen.Minulla ei ole yliopistollista koulutusta, mutta olen suorittanut tavanomaiset kouluopinnot.
Koulun päätettyäni olen käyttänyt vapaaaikani matematiikan parissa työskentelemiseen. En ole seurannut yliopistokurssien tavanomaista kulkua, vaan olen etsinyt uusia teitä. Olen tutkinut hajaantuvia sarjoja yleisesti. Paikalliset matemaatikot kuvailevat saavuttamiani tuloksia ’järisyttäviksi’.

Harkinnan jälkeen Hardy päätti ryhtyä toimeen ja niinpä hän hankki tämän intialaisen käymään yliopistoonsa. Tuloksena yhteistyöstä syntyi runsaasti uutta tiedettä. Myöhemmin Ramanujanin muistikirjoista on löydetty kaikkiaan kaksitoista aluetta (1. alkeismatematiikka,
2. lukuteoria, 3. äärettömät sarjat, 4. integraalit,  5. asymptoottiset ekspansiot ja approksimaatiot,
6. gammafunktio ja siihen liittyvät funktiot, 7. hypergeometriset funktiot,  8. q-sarjat,  9. ketjumurtoluvut, 10. thetafunktiot ja modulaariset yhtälöt,  11.Ramanujanin teoria elliptisistä funktioista ja 12. luokkainvariantit).

Hardy arvioi Ramanujanin merkitystä toteamalla hänellä olleen erinomaisen muistin, mikä ei kuitenkaan ollut poikkeuksellista matemaatikoilla: ”Hänen näkemyksensä algebrallisista kaavoista, äärettömien sarjojen muunnoksista, jne. oli hämmästyttävä. Tässä suhteessa en ole koskaan tavannut hänen veroistaan, ja voin verrata häntä vain Euleriin tai Jacobiin.” ... ”Muistillaan, kärsivällisyydellään ja laskentakyvyllään hän yhdisti tehokkaan yleistyksen, herkkyyden muodon hahmottamiseen ja kyvyn nopeasti muunnella oletuksiaan, mitkä olivat usein järisyttäviä tehden hänestä omalla erityisalallaan (osaajan), jolla ei ollut vertaa omana aikanaan.

Voiko tietojenkäsittelytieteen huipulle päästä "koukaten" - muiden ohi?
Nykyisin henkilöllä, joka rupeaa omatoimisesti tutkimaan tiedettä haluamaansa alaan liittyen on huomattavasti parempi tilanne kuin Giordano Brunolla ja Srinivasa Ramanujanilla. Meillä on nimittäin ainakin kolme asiaa paremmin:
  1. Internet tarjoaa valtaisan määrän tietoa, suuri osa tieteellisistä artikkeleistakin on ilmaisia.
  2. Enää ei tarvitse pelätä, että joutuisi inkvisition uhriksi.
  3. Sähköpostin avulla voi tavoittaa kaukaisiakin professoreita, paremmin kuin 100 vuotta sitten
  4. Yliopistolaitos, ainakin teoriassa, on tarjoavinaan opetusta ja kursseja. Itse en tosin niistä ole juuri ollenkaan päässyt hyötymään, eikä minua päästetty tutkijakoulun viikkopalavereihinkaan mukaan.
  5. Konferensseissa pääsee tapaamaan alansa huippuja (edellyttäen, että on varaa matkustaa).
Ongelmia on edelleen:
  1. Informaatioähkyn takia ihmisiä ei tavoita juuri sen paremmin kuin 100 vuotta sittenkään
  2. Kilpailun takia kilpa-asenne estää vapaata kommunikaatiota vielä kielteisemmin kuin 100 vuotta sitten. Hyvin harvat ovat halukkaita puhumaan suunnitelmistaan.
  3. Sadan vuoden aikana ilmapiiri on muuttunut katkeranoloiseksi. Löytämisen ilo on tieteestä kadonnut, sen sijalle on tullut tulostehtailua. Kirjoittamisesta on tullut itse tarkoitus. Tutkijat taistelevat tänään asemastaan paljolti epärehellisin, vilpillisin keinoin. Ennenkaikkea tämä tulee esille kotimaassa. On aiheetonta solvausta ja toisen työn vähättelyä. 
  4. Rahoitusta tutkimukselle on vielä vaikeampi saada kuin 100 vuotta sitten, sillä pyrkijöitä on pilvin pimein. Rahoittajilla ei ole kykyä tunnistaa niistä kelvollisia.
Miten pääsin MDE-tutkimuksen kärjen tasalle?
Läpäisin yliopistossa maisterivaiheen ja tohtorikoulutusvaiheen lähes käymättä läpi montaakaan oikeaa tietotekniikan tai tietojenkäsittelytieteen kurssia. Kokemukseni perusteella minut päästettiin vähällä, mutta kääntöpuolena en päässyt tuntemaan vertaisopiskelijoita enkä päässyt oppimaan oppimismenetelmiäkään - paitsi kantapään kautta ja itseopiskelemalla. Siinä suhteessa olin tavallaan samassa tilanteessa kuin äskeiset nerotkin.

Lokakuulla (2009) Denverin SLE-konferenssissa aiheena oli formalien kielten suunnittelu (Source Language Engineering), mitä teknologiaa nimitetään nykyisellään Grammarwareksi. Tämän alueen olin opetellut Prolog-kirjoista pitkän ajan kuluessa. Prolog-tekniikan ansiosta oli tehnyt translaattoripatentin kuinka muuntaa lähdekieltä mahdollisimman automaattisesti tehdyllä translaattorigeneraattorilla toiseen kieleen. Tämä innovaatio sai minut perustamaan yrityksen lähdekoodin analysointiinkin.

Mietittyäni lähdekoodin olemusta ja tietomalleja vuosikausia pääsin väitöksessäni johtamaan atomistisen lähdekoodin mallin. Denverissä SLE-teemaan liittyen puhuttiin mallintamisteknologioista (Modelware), jonka pääkäsitteitä ovat Model Driven Engineering (MDE) ja Model Driven Architecture (MDA). Olin jo väitöshankkeeni alussa päättänyt, että parannan MDA-malleja merkittävän paljon (siis yksinkertaistan niitä). MDE:n pääkehittäjä Jean Bezivin oli paikalla Denverissä ja piti pääpuheen (Jim Cordyn toisen puheen ohella). Hän otti MDE:n yhteydessä puheeksi käsitteen technological spaces (teknologia-avaruudet), mikä on olennaisen tärkeä mallintamista ja tietojenkäsittelytiedettä yleensä tarkentava tarkastelun rajaus. Yhden teknologia-avaruuden sisällä tyypillisesti käytetään samantapaisia peruskonstruktioita, menetelmiä, työkaluja ja ratkaisuja. Teknologia-avaruuksia esitellessään Bezivin toi esille kalvossaan kirjani ja kertoi, että mainioita kirjoja teknologia-avaruuksista on jo olemassa.

Jean Bezivin on perehtynyt symbolisen analyysin menetelmääni ainakin blogini kautta. Sieltä hän on voinut havainnoida, että olen parantanut GrammarWare-aluetta muutamilla pienillä, mutta merkittävillä oivalluksilla. ModelWare-puolta olen parantanut merkittävästi atomistisella mallilla. Jutellessani myöhemmin hänen kanssaan kyselin häneltä, onko mitä hänellä on mielessä jatkotutkimuksen suhteen. Hän sanoi, että heidän porukkansa ei aio MoDisco-ohjelmassaan keskittyä imperatiivisiin kieliin, eikä tavoittekaan suoritettavan mallin kehittämistä. Siten SimulationWare ei suoraan kiinnosta heitä, eikä tietämyksen poimiminen Javan koodista lausetasolla. Näissä kahdessa teknologia-osuudessa olin edennyt heitä pidemmälle.  Bezivinillä on Inria-organisaationsa kautta kymmenen vuoden ja satojen miestyövuosien kokemus, mutta käsittelyn linjaukset poikkeavat melkoisesti siitä mihin itse olen päätynyt kymmenen vuoden aikana.


Oheisessa kuvassa kehittämäni teknologia-avaruudet. Ne tukevat huomattavasti paremmin sekä tietokoneen perustoimintojen simulointia että ihmisen ajatteluprosessin synkronointia koodin toimintoihin, kuin mikään muu menetelmä tähän asti.