Tietokoneohjelma

Yleistä

Tavallisesti ohjelmat käsittelevät niille syötettyä tietoja ja tuottavat siitä halutun lopputuloksen. Harvinaisempaa on, että lähtötietoja ei anneta, mutta tämäkin on mahdollista esimerkiksi laskettaessa piille likiarvoa.
Varhaiset ohjelmat olivat pitkälti muotoa lue syöte, tee laskenta, tulosta tulokset. Tämäntyyppiset ohjelmat sopivat hyvin eräajotyyppiseen käsittelyyn, jossa etukäteen valmistellaan syöttötiedot ja itse ohjelman ajo tehdään myöhemmin. Nykyohjelmista vain harvat ovat tätä tyyppiä. Useimmat pöytätietokoneiden ohjelmat ovat interaktiivisia, jolloin ohjelma vastaa käyttäjän tekemiin syötteisiin saman tien. Koska seuraava syöte voi riippua ohjelman antamasta vastauksesta, ero perinteiseen ohjelmaan on suuri.
Varsinaisten tietokoneiden lisäksi ohjelmia on myös monissa laitteissa, kuten matkapuhelimissa, viihde-elektroniikan laitteissa ja kodinkoneissa. Tällaisia laitteita kutsutaan sulautetuiksi järjestelmiksi, koska ohjelma ja laitteisto muodostavat käyttäjän kannalta kiinteän kokonaisuuden. Sulautetuissa järjestelmissä ohjelmat ovat usein reaktiivisia, mikä ohjelman rakenteen kannalta vastaa interaktiivisuutta, mutta laskentaan tulevat tiedot voivat olla lähtöisin käyttäjän lisäksi myös oheislaitteilta, antureilta tai toisista ohjelmista. Esimerkki ohjelmistosta, joka on sekä interaktiivinen että reaktiivinen, on vaikkapa tulospalveluohjelmisto, jolla käyttäjä voi kysyä eri sarjojen tai kilpailijoiden tilannetta (interaktiivisuus), ja jossa tilanne päivittyy muualta kuten väliaikapisteiltä tai maaliviivalta tulevien tietojen mukaan (reaktiivisuus).
Immateriaalioikeuden kannalta ohjelmat kuuluvat tekijänoikeuksien piiriin. Immateriaalioikeuksien kannalta mielenkiintoisia ovat laajalle levinneet vapaat ohjelmistot.

Ohjelmien siirrettävyys

Koska eri suorittimien konekielet ovat erilaisia, ei konekielimuodossa olevaa ohjelmaa voi ajaa kaikissa tietokoneissa. Joskus myös samasta suorittimesta on hieman eri versioita, ja tällöin yleensä on pyritty siihen, että uudempi versio pystyy ajamaan vanhemman suorittimien konekieltä, mutta ei toisin päin. Käännettyjen ohjelmien siirrettävyyttä rajoittaa siis suorittimen ymmärtämä konekieli. Tosin tämä ei ole ainoa rajoittava tekijä. Kohdesuorittimen lisäksi kääntäjä tietää käytössä olevan käyttöjärjestelmän tarjoamat palvelut ja käytännöt. Koska nämä eroavat eri käyttöjärjestelmissä, toiselle käyttöjärjestelmälle tehtyä konekielistä ohjelmaa ei voi ajaa tietokoneessa, vaikka suoritin olisikin sama.
Tilanne muuttuu, jos käytetään tulkkeja. Tällöin tarvitaan kyseiselle konekielelle ja käyttöjärjestelmälle toteutettu ohjelmointikielen tulkki, mutta sitten tämä tulkki pystyykin suorittamaan lähdekielimuodossa ohjelmaa riippumatta siitä, mihin ympäristöön se on alun perin tehty. Tosin tulkkikin voi tarjota käyttöjärjestelmästä riippuvia palveluita, mutta jos ohjelmoija on osannut välttää näitä, ei siirrettävyysongelmaa pitäisi tulla.
Ohjelmointikielellä kirjoitettu ohjelma voidaan myös kääntää uudelleen eri suoritintyypeille ja käyttöjärjestelmille. Periaatteessa ohjelmien pitäisi olla helposti siirrettäviä tällä tasolla, mutta käytännössä ohjelmoija voi tehdä moniakin sellaisia ratkaisuja, jotka rajoittavat siirrettävyyttä. Näitä ovat muun muassa oletukset kokonaislukujen arvoalueesta tai liukulukujen tarkkuudesta. Ohjelmoija voi myös käyttää käyttöjärjestelmäkohtaisia operaatioita.
Edellä olevien kahden vaihtoehdon ongelmien eli tulkkaamisen hitauden ja käännetyn ohjelman huonon siirrettävyyden takia käytetään joissain tilanteissa niin sanottua välikoodia. Tällöin ohjelma on jo käännetty, mutta ei konekielelle, vaan eräänlaiseen välimuotoon, jota kohdekoneessa oleva välikoodin tulkki tulkitsee. Tätä tekniikkaa voidaan käyttää esimerkiksi verkkosovelluksia ohjelmoitaessa, jossa käyttäjän koneen ominaisuuksia ei voida tietää etukäteen (katso myös Java-kieli).
Ohjelmien siirrettävyyttä voivat rajoittaa myös sen tarvitsemat resurssit kuten muistin määrä, suorittimen nopeus tai jokin erityinen oheislaite. Esimerkiksi DVD:lle tallentava ohjelma on käyttökelvoton ilman laitetta, joka osaa tehdä varsinaisen DVD-levylle kirjoittamisen.
Hankkiessaan ohjelmaa käyttäjän on tiedettävä käyttökoneen suoritinarkkitehtuuri ja käyttöjärjestelmä. Monet vapaat tai valmiiksi käännetyt ohjelmat löytyvät arkistokoneilta näiden tietojen mukaan lajiteltuina.

Ohjelmien luotettavuus

Oikein toimivan ohjelman ohjelmointitavalla ei ole merkitystä käyttäjälle. Valitettavasti ohjelmien täydellinen testaaminen on käytännössä (ja joissain tapauksessa jo teoriassakin) mahdotonta, joten aivan yksinkertaisimpia ohjelmia lukuun ottamatta ohjelmissa on oletusarvoisesti jokin havaitsematon virhe. Siitä huolimatta ohjelma voi olla hyvinkin käyttökelpoinen, sillä virhe voi esiintyä hyvin harvoin tai niin pieni, että siitä ei ole käytännön haittaa.
Eri käyttötarkoitukseen tehtyjen ohjelmien luotettavuusvaatimukset ovat hyvin erilaisia. Interaktiivinen julkaisuohjelma voi olla harmillinen toimiessaan väärin, mutta virheestä ei silti seuraa välittömästi vaaratilanteita tai vastaavaa. Sen sijaan vaikkapa lentokoneen ohjausohjelmiston virhe voisi pudottaa koneen taivaalta.
Osassa ohjelmia on oikean toiminnan lisäksi tärkeää ohjelman oikea ajoitus. Jos ohjelma toimii väärään aikaan, siis joko liian aikaisin tai liian myöhään, seurauksena voi olla järjestelmän täysi toimimattomuus. Esimerkiksi matkapuhelinliikenteessä yksikin väärään aikaan lähettävä puhelin voi pimentää koko tukiaseman alueen liikenteen. Ohjelmia, joissa aikatekijä on osa ohjelman oikeellisuutta, kutsutaan reaaliaikaohjelmiksi.
Yksi ohjelmien toimimattomuusongelma liittyy siihen, että niiden ajoympäristöä vaihdetaan. Syynä voi olla esimerkiksi käyttöjärjestelmän tai dynaamisen ohjelmakirjaston päivittäminen uuteen versioon.

Ohjelmien sovittaminen

Ohjelmien sovittamisella tarkoitetaan sitä, että ohjelman toimintaa voidaan muuttaa käyttöpaikan tarpeiden mukaan. Sovittaminen voi olla tehty käännösvaiheessa, mutta parhaimmillaan sama ohjelma toimii eri tavalla eri käyttöpaikoissa. Tiedot asetuksista on tällöin talletettu joko ohjelma- tai käyttäjäkohtaiseen alustustiedostoon.
Mikäli sovittaminen ylittää kulttuuri- ja kielirajoja, puhutaan lokalisoinnista. Lokalisoinnilla voidaan vaihtaa ohjelman käyttöliittymän kieli toiseksi, vaihtaa kellonajan tai päivämäärän esitystapaa, päättää onko käytössä desimaalipiste ja -pilkku, muuttaa käytössä olevia värejä ja niin edelleen.