Tietokoneista ja ohjelmista
Lyhyesti tietokoneen rakenteesta
Tietokoneen perusosia ovat prosessori eli suoritin, keskusmuisti, syöttölaitteet ja tulostuslaiteet. Prosessori varsinaisesti suorittaa tietokoneohjelmat. Se pystyy esimerkiksi laskemaan kaksi lukua yhteen, tutkimaan onko jokin luku suurempi kuin nolla, hakemaan käsiteltäviä lukuja keskusmuistista jne.
Keskusmuisti on se tietokoneen osa, jossa sijaitsee parhaillaan suoritettava ohjelma ja sen käsittelemä data, esimerkiksi ne luvut, joille ohjelmassa pitää tehdä laskutoimituksia. Keskusmuisti koostuu peräkkäisistä muistipaikoista, joista jokaisella on oma tunnus, osoite. Yhteen muistipaikkaan voidaan tallentaa yksittäinen merkki tai osa yhdestä luvusta. Kun tietokone sammutetaan, sen keskusmuistissa oleva tieto katoaa.
Syöttölaitteella käyttäjä voi antaa käskyjä ja dataa tietokoneelle. Tyypillisiä syöttölaitteita ovat esimerkiksi näppäimistö ja hiiri. Tulostuslaitteilla, esimerkiksi näyttöpäätteellä ja tulostimella taas tietokone antaa tietoa käyttäjälle.
Keskusmuistin lisäksi tietokoneeseen on yleensä liitetty ulkoista muistia, esimerkiksi kovalevy ja väliaikaisesti muistitikku. Tällainen ulkoinen muisti voi toimia tietokoneessa sekä syöttö- että tulostuslaitteena.
Mikä on tietokoneohjelma?
Tietokoneen toimintaa ohjataan tietokoneohjelman avulla. Ohjelma on jono yksinkertaisia käskyjä, joita tietokoneen prosessori suorittaa järjestyksessä yksi kerrallaan. Tilannetta voi verrata siihen, että kokki tekee ruokaa keittokirjan ohjeen avulla. Kokki lukee reseptiä ja suorittaa siinä olevia käskyjä järjestyksessä. Kun keittokirjassa on käskyjä “vatkaa munat ja sokeri vaahdoksi”, “lisää jauhot munasokerivaahtoon”, niin tietokoneohjelmassa voi olla esimerkiksi seuraavanlaisia käskyjä: “pyydä käyttäjältä luku ja lue se”, “vähennä luvusta 32”, “kerro erotus viidellä”, “jaa tulos yhdeksällä” ja “tulosta kuvaruudulle näin saatu lopputulos”.
Tietokoneohjelmalla ja keittokirjan reseptillä on myös eroja. Reseptissä osa käskyistä voi olla epämääräisiä, esimerkiksi “lisää suolaa maun mukaan”. Tietokoneohjelmassa kaikkien käskyjen täytyy olla täsmällisiä ja täysin yksiselitteisiä. Reseptin käskyjä suoritetaan yleensä siinä järjestyksessä kuin ne on ohjeessa annettu. Tietokoneohjelmassa on usein käskyjä, jotka aiheuttavat sen, että ohjelman suorituksessa hypätään kokonaan toiseen paikkaan ohjelmassa.
Tietokoneen ymmärtämät käskyt ovat hyvin yksinkertaisia, kuten “Laske kaksi lukua yhteen”, “Hyppää ohjelmassa kohtaan X”. Tietokoneen tehokkuus ja monikäyttöisyys perustuu siihen, että tietokone pystyy suorittamaan näitä käskyjä todella nopeasti.
Lisäksi käskyt pitää esittää tietokoneelle bittijonoina eli erilaisina ykkösten ja nollien yhdistelminä. Tätä kutsutaan konekieleksi. Ensimmäisiä rakennettuja tietokoneita ohjelmoitiinkin niin, että koneessa olevien kytkimien avulla koneelle annettiin ykkösten ja nollien jonoja, jotka muodostivat käskyjä. Tällainen ohjelmointi oli luonnollisesti hyvin hidasta ja virhealtista. Jos yksikin kytkin oli väärässä asennossa, koko ohjelman suoritus meni sekaisin.
Ohjelmoinnin helpottamiseksi kehitettiin symbolinen konekieli, Assembler. Siinä käskyjä ei esitetä enää bittijonoina, vaan jokaista käskyä varten on sovittu määrätty sana, esimerkiksi yhteenlaskukäsky on yleensä add ja vähennyslaskukäsky sub. Lisäksi käskyt sisältävät tiedon siitä, missä ovat ne luvut, joille operaatio tehdään. Tietokone ei suoraan ymmärrä symbolisen konekielen käskyjä, vaan jotta symbolisella konekielellä kirjoitettu tietokoneohjelma voitaisiin suorittaa, pitää ensin muuttaa symbolisen konekielen käskyt tietokoneen ymmärtämiksi bittijonoiksi. Tätä muunnosta ei tarvitsee kuitenkaan suorittaa käsin, vaan voidaan kirjoittaa tietokoneohjelma, joka suorittaa muunnoksen. Jokaista symbolisen konekielen käskyä vastaa suoraan yksi määrätty bittijono, joten muunnoksen suorittaminen on hyvin suoraviivaista.
Symbolisenkin konekielen ongelmana on kuitenkin se, että ohjelmoija joutuu sitä käyttäessään ajattelemaan asioita huomattavasti yksityiskohtaisemmin kuin mikä on tarkoituksenmukaista. Ohjelmoijan pitää esimerkiksi koko ajan olla selvillä siitä, missä kohdassa tietokoneen muistissa käsiteltävät luvut täsmällisesti sijaitsevat. Jos haluataan laskea kaksi lukua yhteen, vaatii tämä usein monta konekielen käskyä, kun käsiteltäviä lukuja on ensin siirrettävä keskusmuistista prosessorin sisällä oleviin muistipaikkoihin. Näiden yksityiskohtien ajatteleminen tekee ohjelmoinnin työlääksi ja lisää myös virhemahdollisuuksia. Lisäksi jokaiselle prosessorityypille on oma konekieli. Yhdelle tietokoneelle symbolisella konekielellä kirjoitettu ohjelma ei toimi toisentyyppisessä tietokoneessa.
Symbolisen konekielen ongelmien ratkaisemiseksi ruvettiin vähitellen kehittämään lausekieliä. Lausekielisissä ohjelmissa monta peräkkäistä konekielen käskyä on korvattu yhdellä lausekielen käskyllä. Käskyt on suunniteltu niin, että ne vastaisivat sellaisia loogisia kokonaisuuksia, joita ohjelmoija ajattelee. Python on yksi lausekieli. Muita lausekieliä ovat esimerkiksi Cobol, Fortran, Pascal, C, C++ ja Java.
Tietokone ei kuitenkaan ymmärrä lausekielistä ohjelmaa sellaisenaan, vaan lausekielinen ohjelma on muutettava konekieliseksi, jotta se voitaisiin suorittaa. Tähän tarkoitukseen käytetään jälleen toista ohjelmaa. Tarkoitukseen käytettävät ohjelmat voidaan jakaa kahteen luokkaan, kääntäjiin ja tulkkeihin.
Kääntäjä ottaa koko lausekielisen ohjelman, muuttaa sen konekielelle ja tallentaa konekielisen ohjelman tiedostoon. Tämän jälkeen konekielinen ohjelma voidaan ajaa mielivaltaisen monta kertaa ilman, että ohjelmaa tarvitsee kääntää uudelleen.
Tulkki käy läpi lausekielistä ohjelmaa käsky kerrallaan, muuttaa käskyn konekielelle ja suorittaa konekielisen käskyn tai käskyt. Tämän jälkeen tulkki siirtyy lausekielisen ohjelman seuraavaan käskyyn. Konekielisiä käskyjä ei tallenneta minnekään, vaan jos ohjelma halutaan suorittaa uudelleen, pitää se myös tulkita kokonaan uudelleen. Python-kielisen ohjelman suorittamiseen käytetään tulkkia.
Lausekielten etu symboliseen konekieleen verrattuna on se, että ohjelmointi niillä on nopeampaa ja vähemmän virhealtista. Lisäksi ohjelmointi ei enää riipu siitä tietokoneesta, jolla ohjelma aiotaan suorittaa. Lausekielellä kirjoitettu ohjelma voidaan ajaa millä tietokoneella tahansa, kunhan tälle tietokoneelle on olemassa kääntäjä tai tulkki, joka muuttaa kyseisellä lausekielellä kirjoitetun ohjelman konekieliseksi.
Python-ohjelmointikielestä on eri versioita sen mukaan, kuinka uutta Python-tulkkia käytetään. Tässä oppimateriaalissa käytetään Python-versiota 3.4. Kotikoneeseen voi hyvin asentaa myös version 3.3, 3.5 tai 3.6 tai 3.7, sillä näiden versioiden välillä ei ole sellaisia eroja, joilla olisi merkitystä tällä kurssilla. Sen sijaan versiossa 2.7 ja sitä vanhemmissa versioissa on olennaisia muutoksia uudempiin verrattuna, eikä näiden versioiden käyttö ole tällä kurssilla enää mahdollista.
Mihin teekkari tai diplomi-insinööri tarvitsee ohjelmointia?
Suurin osa tietokoneen käytöstä on valmiiden ohjelmien (esimerkiksi tekstinkäsittely, taulukkolaskenta, www-selain) käyttöä. Näitä ohjelmia kirjoittavat yleensä ohjelmointialan ammattilaiset, eikä muun alan diplomi-insinöörin tarvitse tehdä niitä itse. Toisenkin alan diplomi-insinöörille ja teekkarille tulee kuitenkin vastaan tilanteita, joissa on hyödyllistä osata kirjoittaa oma tietokoneohjelma.
Yksi tyypillinen esimerkki on tilanne, jossa tarvitaan pientä laskentasovellusta. Pitäisi lukea lähtötiedot tiedostosta, tehdä niille joitakin laskutoimituksia, jotka saattavat sisältää esimerkiksi optimointia tai iterointia, ja tulostaa tulokset kuvaruudulle tai tiedostoon. Laskutoimituksia tarvitaan niin paljon, että niiden tekeminen taskulaskimella tai taulukkolaskentaohjelmalla on liian työlästä.
Toinen esimerkki on tilanne, jossa pitäisi liittää mittalaite tai vastaava tietokoneeseen. Usein tällaisen laitteen mukana tulee joukko aliohjelmia, joiden avulla voidaan esimerkiksi käynnistää laite, lopettaa sen toiminta ja muuttaa laitteen asetuksia. Laitteen käyttäjän on kuitenkin kirjoitettava itse pieni ohjelma, joka käynnistää laitteen mukana tulleet aliohjelmat halutussa järjestyksessä.
Myös erilaisia taulukko- ja matriisilaskentaohjelmia käytettäessä ohjelmointitaidosta on paljon hyötyä.
Ohjelmointitaito auttaa myös valmiiden kaupallisten ohjelmien käytön oppimisessa ja niiden toiminnan ymmärtämisessä. Kun on käsitys niistä periaatteista, jotka ovat ohjelmoinnin taustalla, on paljon helpompi ymmärtää, miksi valmis ohjelma toimii niin kuin se toimii.
Jos on kiinnostunut opiskelemaan ohjelmointia enemmän, niin työelämässä on paljon paikkoja sellaisille henkilöille, jotka hallitsevat hyvin jonkin insinöörialan ja osaavat lisäksi ohjelmoida hyvin. Tällaiset henkilöt kirjoittavat yleensä omaan alaansa liittyviä ohjelmia. Tällaisiin työtehtäviin ei tosin tällä kurssilla opetettava ohjelmointitaito riitä, vaan silloin ohjelmointia on opiskeltava selvästi enemmän. Sen sijaan tässä luvussa aiemmin mainitut tavoitteet ovat saavutettavissa jo tämän kurssin jälkeen.