Copyright, Lauri Malmi. Teksti on julkaistu alunperin kirjassa:
"Ohjelmoinnin perusteet ja Pascal-kieli", OtaData 1988.
3. Tietokone ja ohjelmointikieli
Tämän luvun alussa esitetään karkea yleiskuvaus
tietokoneen rakenteesta ja toiminnasta. Näiden tunteminen ei ole välttämätöntä
ohjelmoinnin opiskelussa, joten kohta 3.1 voidaan jättää
ensimmäisellä lukemalla vähemmälle huomiolle. Laitteiston
perusasioiden tuntemisesta on kuitenkin apua eräiden ohjelmointikielen
käsitteiden ymmärtämisessä ja myöhemmissä
luvuissa selitetäänkin tällaisia asioita tämän
luvun tietoihin nojautuen.
Luvun muissa alakohdissa selitetään ohjelmointikielen yleiset
perusteet ja kuvataan tietokoneohjelman suorittamiseen liittyviä asioita.
Lukija saa sen pohjalta suppean käsityksen siitä, miten kirjoitettu
ohjelmakoodi muuntuu toimivaksi tietokoneohjelmaksi.
3.1 Tietokoneen rakenteesta ja toiminnasta
3.1.1 Tietokoneen rakenne
Tietokonemalleja on viime vuosikymmeninä rakennettu lukuisa määrä,
jotka eroavat suuresti toisistaan kooltaan, suorituskyvyltään,
tekniikaltaan ja hinnaltaan. Niillä kaikilla on tiettyjä yhteisiä
perustoimintoja, joiden välttämättömyys on helposti
nähtävissä.
-
Tietokoneen tulee pystyä lukemaan tietoja ulkomaailmasta omaan käyttöönsä.
-
Tietokoneen tulee pystyä käsittelemään tietoa ja käsittelyn
aikana varastoimaan sitä.
-
Tietokoneen tulee pystyä siirtämään tietoa ulkopuolelleen.
-
Tietokoneen tulee pystyä suorittamaan matemaattisia operaatioita,
kuten yhteen-, vähennys-, kerto- ja jakolaskuja.
-
Tietokoneen tulee pystyä vertailemaan tietoja ja valitsemaan toimenpiteitä
vertailun tuloksen pohjalta. Vertailulla tarkoitetaan tässä tietojen
yhtäsuuruuden, erisuuruuden tai muun keskinäisen suhteen toteamista.
-
Tietokoneen suorittamaa tehtävää täytyy voida muuttaa.
Kyseessä ei siis saa olla pelkkä automaatti, joka tekee aina
saman tehtävän, oli tämä kuinka monimutkainen tahansa.
Tietokoneen tätä ominaisuutta kutsutaan ohjelmoitavuudeksi.
Kohdista 1-3 seuraa tietokoneiden tavanomainen rakenne: koneen perusosina
ovat suoritin eli prosessori , keskusmuisti ja oheislaitteet
. Suoritin sisältää koneen varsinaisen "älyn" ja se
toteuttaa tarpeet 4-6. Muut osat ovat luonteeltaan vähemmän itsenäisiä
eli suoritin ohjaa tai koordinoi niiden
toimintaa.
Prosessoria ja keskusmuistia yhdessä kutsutaan nimellä keskusyksikkö.
Keskusmuisti
on tarpeen, jotta suorittimen käsittelemä tieto voidaan tilapäisesti
varastoida käsittelyn aikana. Oheislaitteita tarvitaan tallennettaessa
tietoa keskusyksikön ulkopuolella sekä siirrettäessä
tietoa koneen ja ulkomaailman välillä. Jälkimmäisiä
kutsutaan joko syöttö- tai tulostuslaitteiksisen mukaan,
kumpaan suuntaan tieto siirtyy. Tyypillisiä syöttölaitteita
ovat näppäimistö ja hiiri,
tulostuslaitteita puolestaan kuvaruutu (monitori) ja kirjoitin. Tiedon
tallentamiseen käytetyt laitteet, kuten levyasema,
voivat toimia kummassakin tehtävässä.
Seuraavassa on tietokoneen perustoimintojen rakennekaavio.
Kuvio 3-1: Tietokoneen perusrakenne.
Tiedon esittäminen tietokoneessa perustuu sähköisten
piirien ominaisuuksiin. Helpoimmin on teknisesti toteutettavissa piiri,
jolla on vain kaksi tilaa: esimerkiksi jännite jossain elementissä
on 0 V tai 5 V. Tämän vuoksi tiedon esitystapana ovat kaksijärjestelmän
luvut eli binääriluvut
, jotka sisältävät vain ykkösiä ja nollia. Tiedon
perusyksikkönä on yksi
bitti , johon voidaan tallentaa
yksinumeroinen binääriluku eli arvo 0 tai 1. Käytännössä
tarvitaan kuitenkin suurempia yksikköjä, joita ovat tavu ja
sana. Tavuun kuuluu yleensä 8 bittiä ja sanaan yhdestä
neljään tavua eli siis 8, 16, 24 tai 32 bittiä. Tietokoneen
sananpituuden mukaan puhutaan mm. 8-, 16- ja 32-bittisistä
koneista.
Keskusmuisti koostuu peräkkäisistä sanoista tai tavuista,
joita kutsutaan muistipaikoiksi
. Ne erotetaan toisistaan kunkin muistipaikan osoitteen perusteella:
ensimmäisen osoite on 0, seuraavalla 1, jne. Muistin kokoa mitataan
yleensä kiloina , jolloin 1 kilo (merkitään 1K) on
2^10 eli 1024 muistiyksikköä (tavua
tai sanaa). Näin ollen koneessa, jossa on 64 kiloa (64K) muistia,
muistiosoitteet ovat välillä 0 - (2^16 - 1) (kymmenjärjestelmässä
65535). Suurempi muistin koon yksikkö on mega , joka tarkoittaa
2^10 kiloa eli runsaat miljoona muistipaikkaa (esim. 1M keskusmuistia).
Muistin rakenne:
-
Perusyksiköt ovat bitti, tavu ja sana.
-
Suurempia yksiköitä ovat kilotavu, kilosana, megatavu
ja megasana.
-
Pienintä muistiosoitteen avulla erotettavaa yksikköä
kutsutaan muistipaikaksi.
-
Kullakin muistipaikalla on yksikäsitteinen osoite.
Keskusmuistissa tieto ja ohjelma säilyvät vain niin kauan,
kuin koneessa on virta päällä. Koska tietojen olemassaolo
halutaan varmistaa muinakin aikoina, ne tallennetaan muulloin oheislaitteelle,
josta käytetään myös nimitystä massamuisti
. Massamuistina voivat toimia esimerkiksi levyke
tai kovalevy. Massamuistin ja keskusmuistin erona on tiedon säilyvyyden
lisäksi myös se, että keskusmuisti toimii paljon nopeammin
(viitattaessa jossain osoitteessa olevaan muistipaikkaan), mutta on vastaavasti
myös kalliimpaa kuin massamuisti. Jälkimmäistä on taas
yleensä tarjolla huomattavasti enemmän kuin keskusmuistia.
3.1.2 Tietokoneen toiminta*
Tietokoneen toiminta perustuu siihen, että suoritin osaa toteuttaa
joukon komentoja, jotka käsittelevät muistissa olevaa ja tietokoneen
sekä oheislaitteiden välillä siirrettävää
tietoa. Komentovalikoima eli käskykanta vaihtelee suuresti
eri koneissa. Tärkeimmät käskyt on kuitenkin suoraan johdettavissa
edellä esitetyistä tarpeista 1-5. Seuraavassa esitetään
näihin perustuva hyvin yksinkertaisen koneen käskykanta.
Oletetaan että koneeseen liittyy vain yksi syöttö- ja yksi
tulostuslaite ja että suorittimen sisällä on yksi rekisteri
(akku) .
IN |
Lukee syöttölaitteella olevan tiedon akkuun |
OUT |
Kirjoittaa akun sisällön tulostuslaitteelle |
SET i |
Tallettaa akkuun luvun i |
LOAD x |
Lukee osoitteessa x olevan muistipaikan sisällön akkuun |
STORE x |
Tallettaa akun sisällön osoitteessa x olevaan muistipaikkaan |
ADD x |
Lisää muistipaikassa x olevan luvun akun sisältöön |
SUB x |
Vähentää akun sisällöstä muistipaikassa
x olevan luvun |
CMP x |
Vertaa muistipaikan x sisältöä akun sisältöön.
Jos se on suurempi tai yhtä suuri kuin tämä, hypätään
ohjelmassa seuraavan komennon yli, muutoin suoritetaan seuraava komento |
JUMP x |
Ohjelman suoritus jatkuu muistipaikassa x olevasta käskystä |
HALT |
Pysäyttää ohjelman |
Ohjelmaa suoritetaan seuraavasti:
-
Jokaisella käskyllä on oma binäärinen vastineensa,
joka tallennetaan muistiin kuten tavalliset luvutkin. Käskyt ovat
siis pelkkiä binäärilukuja, joten muistia selaamalla ei
voida erottaa, mitkä luvut ovat käskyjä mitkä käsiteltävää
tietoa eli dataa. Ohjelmoijan tai ohjelmointijärjestelmän
tulee huolehtia siitä, että nämä asiat eivät mene
sekaisin eli ettei suoritin yritä tulkita dataa ohjelmana.
-
Suoritin pystyy hakemaan muistista sinne talletetut käskyt yksi kerrallaan
ja tulkitsemaan ne. Käskyt on talletettu muistiin peräkkäisiin
muistipaikkoihin, jolloin suoritettuaan yhden käskyn loppuun suoritin
hakee seuraavan käskyn lähinnä seuraavasta muistipaikasta.
-
Tästä oletusjärjestyksestä poiketaan vain, jos suoritettu
käsky antoi ohjeen hakea uuden käskyn jostain muusta osoitteesta.
Tällöin on kyseessä joko hyppykäsky
(JUMP) tai
haarautumiskäsky
(CMP). Näiden erona on se, että edellisen seurauksena ohjelman
suoritus jatkuu uudesta osoitteesta aina, jälkimmäisen seurauksena
vain silloin, jos tietty ehto on voimassa (muistipaikan x sisältö
> akun sisältö).
-
Ohjelman suoritus päättyy kohdattaessa HALT-komento, joka pysäyttää
ohjelman.
Kerto- ja jakolasku voidaan palauttaa yhteen- ja vähennyslaskuun,
joten koneessa ei ole erikseen käskyjä niitä varten. HALT-käsky
on tarpeellinen siitä syystä, että suoritin yrittäisi
muutoin hakea muistista jatkuvasti uusia käskyjä toisiaan seuraavista
muistiosoitteista. Ohjelma ei joko loppuisi lainkaan tai todennäköisemmin
suoritin kohtaisi sellaisia binäärilukuja, joita se ei osaisi
tulkita käskyinä. Tällöin suoritin joutuisi keskeyttämään
ohjelman suorituksen virhetilanteeseen.
Seuraavana esitetään pieni esimerkkiohjelma käyttäen
ylläolevaa käskykantaa. Ohjelma lukee syöttölaitteelta
10 lukua, laskee niiden summan ja kirjoittaa sen tulostuslaitteelle eli
suorittaa saman asian kuin seuraava Pascal-ohjelman katkelma:
summa := 0;
maara := 0;
repeat
Read(luku);
summa := summa + luku;
maara := maara + 1;
until maara >= 10;
Write(summa);
Käskyjen edessä olevat numerot ovat muistiosoitteita. Muistipaikkaan
100 talletetaan laskettava summa, muistipaikkaan 101 luettujen lukujen
määrä ja muistipaikkaan 102 kulloinkin luettu luku. Paikkaan
103 tallennetaan vakio 1, joka vähennetään lukumäärästä
joka kierroksella, ja paikkaan 104 luettavien lukujen kokonaismäärä
(10). Käskyjen jälkeen on selitetty niiden merkitys.
10 SET 0
; Asetetaan summan alkuarvoksi 0.
11 STORE 100
12 SET 0
; Asetetaan luettujen lukujen määrän alkuarvoksi 0.
13 STORE 101
14 SET 10
; Asetetaan luettavien lukujen määräksi 10.
15 STORE 104
16 SET 1
; Asetetaan lukumäärän muutokset arvoksi 1.
17 STORE 103
18 IN
; Luetaan luku akkuun syöttölaitteelta.
19 STORE 102 ; Tallennetaan
se hetkeksi muistiin.
20 LOAD 100
; Siirretään summan arvo akkuun
21 ADD 102
; ja lisätään luettu luku siihen.
22 STORE 100 ; Tallennetaan
summan uusi arvo takaisin muistiin.
23 LOAD 101
; Siirretään lukumäärä akkuun
24 ADD 103
; ja lisätään siihen 1.
25 STORE 101 ; Tallennetaan
uusi arvo takaisin muistiin.
26 CMP 104
; Tutkitaan, onko akku jo 10
27 JUMP 18
; Jos ei ollut, palataan lukemaan uusi luku
28 LOAD 102 ;
Muutoin siirretään summa akkuun
29 OUT 102
; ja kirjoitetaan se tulostuslaitteelle.
30 HALT
; Pysäytetään ohjelma.
Kuvio 3-2 havainnollistaa ohjelman ja sen käyttämien muistipaikkojen
sijaintia muistissa. Muistipaikkoja, joiden osoitteet ovat välillä
0-9, 31-99 ja 105-..., ei tarvita tämän ohjelman kanssa lainkaan.
Kuvio 3-2: Ohjelma ja data muistissa.
3.2 Mikä on ohjelmointikieli?
Inhimillisen kommunikaation ja toisaalta ihmisen ja tietokoneen
kommunikaation välillä on perustavaa laatua oleva ero. Inhimillinen
tiedon välitys perustuu puhuttuun tai kirjoitettuun kieleen, joista
edellisessä lisäksi ilmeillä ja eleillä on merkittävä
osuus. Inhimillisen kielen eli ns. luonnollisen kielen ymmärtäminen
edellyttää yhteisiä taustatietoja käsitteiden merkityksestä,
koska ilmaisut ovat usein epätäsmällisiä. Esimerkiksi
isoäidin kakkureseptissä saattaa lukea "hieman kaakaota ja ripaus
kanelia". Mikäli tällaista yhteistä taustaa ei ole, kommunikaatio
vaikeutuu ja kakku ei maistukaan samalta kuin entisaikoina mummolassa.
Inhimilliseen kommunikaatioon liittyy myös oppiminen, joten seuraamalla
isoäidin työskentelyä keittiössä on mahdollista
selvittää oikeat annostelumäärät.
Tietokoneelta puuttuvat kaikki nämä tekijät. Se ymmärtää
vain hyvin rajallisen joukon etukäteen määrättyjä
täsmällisiä toimintoja, jotka on välitettävä
sille jossain kiinteässä esitysmuodossa. Sillä ei ole kykyä
ymmärtää asioiden ja käsitteiden taustoja eikä
kykyä oppia.
Perusongelma ihmisen ja tietokoneen välisessä kommunikaatiossa
on se, että siihen tarvitaan välitysmekanismi, jota molemmat
ymmärtävät. Koska tietokone ei ymmärrä luonnollista
kieltä, sen ohjaamiseen käytetään ohjelmointikieltä.
Tämä eroaa luonnollisesta kielestä seuraavilta osin:
Ohjelmointikielen ja luonnollisen kielen tärkeimmät erot:
-
Ohjelmointikielen käsitteet ja rakenteet on määritelty täsmällisesti.
-
Ohjelmointikielellä ilmaistut asiat ovat yksiselitteisiä.
Näistä syistä ohjelmointikielen lauseissa ei ole tulkinnan
varaa, vaan ihminen ja kone ymmärtävät
esitetyn asian samalla tavalla.
Ohjelmointikielet kuuluvat laajempaan ns. muodollisten eli formaalien
kielten luokkaan, joilla on samat ominaisuudet. Muita formaaleja kieliä
ovat mm. matematiikassa ja logiikassa käytetyt merkintätavat.
Ohjelmointikieliä on maailmassa tuhansia, mutta laajemmassa käytössä
on vain kymmenkunta kieltä. Muut kielet on suunniteltu yleensä
erityistarkoituksiin, joihin tavallisempien kielten ominaisuudet eivät
kunnolla sovellu.
Kielet jaetaan ns. matalan tason kieliin ja korkean tason
kieliin sen mukaan, kuinka abstrakteja
toimintoja ja käsitteitä ne sisältävät. Matalan
tason kielillä voidaan periaatteessa tehdä samat asiat kuin korkean
tason kielilläkin, mutta se ei ole useinkaan mielekästä,
koska ihmisen on helpompaa ja nopeampaa esittää ajatuksiaan jälkimmäisten
avulla. Matalan tason kieliä ovat assembler- ja konekielet
, joiden käsitteet ja toiminnot liittyvät suoraan tietokoneen
suorittimen toimintoihin. Tästä syystä myös jokaisella
erilaisella suorittimella on oma assembler- ja konekielensä. Assembler-kielinen
ohjelma on tekstiä, jota ihminen voi lukea, mutta konekielinen ohjelma
sisältää vain kaksijärjestelmän lukuja.
Korkean tason kielellä kirjoitetut ohjelmat eivät ole sidottuja
minkään tietokoneen erityisominaisuuksiin, vaan samaa ohjelmaa
voidaan suorittaa eri tietokoneilla. Tätä kutsutaan ohjelmankoneriippumattomuudeksi.
Pascal-kieli on yleinen korkean tason kieli, joka on
suunniteltu erityisesti opetuskäyttöön. Sen tärkeimpiä
hyviä ominaisuuksia ovat suuri ilmaisuvoima erilaisen tiedon esityksessä
ja käsitteiden suhteellisen pieni määrä. Verrattuna
etenkin kotimikroissa yleiseen alkeiskieleen, BASIC-kieleen, Pascal-kielellä
on olennaisesti paremmat mahdollisuudet rakentaa suuria ja monimutkaisia
ohjelmia hallitusti. Toisaalta Pascalissa (standardin mukaisena) on selkeät
puutteensa, jotka rajoittavat sen käyttökelpoisuutta eräissä
tehtävissä. Niistä on lyhyesti kerrottu kirjan lopussa.
3.3 Ohjelmointikielen perusasiat
Edellä kohdassa 3.1 tuotiin esille joukko tarpeita, jotka tietokoneen
tulee täyttää. Näitä olivat:
tiedon siirtäminen koneen ja ulkomaailman välillä
tiedon tallentaminen koneen sisällä
matemaattiset toiminnot
tiedon vertailu ja toimenpiteiden valitseminen tämän pohjalta
Näistä perustarpeista voidaan johtaa ohjelmointikielessä
tarvittavat toiminnot. Samassa kohdassa esitettiin myös yksinkertaisessa
konekielessä olevat käskyt, jotka tyydyttivät nämä
tarpeet. Korkean tason kielissä on olemassa samat perustoiminnot,
mutta niissä asiat vain ilmaistaan paljon havainnollisemmalla tavalla.
Lisäksi korkean tason kielten toiminnot ovat laajaalaisempia kuin
konekielessä. Yhdellä korkean tason kielen komennolla voidaan
tehdä asia, johon konekielessä tarvittaisiin useita, jopa kymmeniä
käskyjä. Vrt. kohdan 3.1.2 esimerkkiohjelmat.
Korkean tason kielen perustoiminnot on lueteltu alla. Viimeistä
kolmea kohtaa ei ole johdettu em. tietokoneille asetetuista tarpeista,
vaan vaatimuksista, jotka nousevat ohjelman toteuttamiseen liittyvistä
käytännön ongelmista.
-
Tiedon tallentaminen ohjelman suorituksen aikana. Tällä tarkoitetaan
seuraavia mekanismeja:
-
Ohjelmassa tarvitaan rakenteita, joihin voidaan tallentaa tietoa käsittelyä
varten. Näitä ovat muuttujat ja vakiot.
-
Ohjelmassa tulee voida käsitellä erityyppistä tietoa, kuten
kokonaislukuja, reaalilukuja ja tekstitietoa. Käsittelyyn liittyy
paitsi erityyppisen tiedon esittäminen ohjelmassa, myös kullekin
tietotyypille ominaiset operaatiot. Numeeriselle tiedolle tarvitaan matemaattisia
toimintoja ja merkkitiedolle aakkosjärjestys.
-
Tietoa täytyy pystyä jäsentämään yhdistämällä
joukko erillisiä tietoja kokonaisuudeksi. Tällaista yhdistettä
voidaan käsitellä kokonaisena tai osissa. Esimerkiksi tietojen
esittäminen taulukon avulla on yleinen menetelmä eri ohjelmointikielissä.
-
Tietoa siirretään ohjelman eri osien välillä. Suuri
ohjelma on jaettu erillisiin osiin ja näiden välillä täytyy
pystyä siirtämään tietoa ohjelman suorituksen aikana.
-
Tiedon siirtäminen ohjelman ja ulkomaailman välillä
-
Ohjelmassa tarvitaan usein yhteydenpitoa käyttäjän kanssa,
joten ohjelman tulee voida lukea käyttäjän antamia tietoja
ja kirjoittaa halutut tiedot käyttäjän näkyville.
-
Ohjelman laskemia tietoja tulee pystyä tallettamaan pysyvään
muotoon massamuistiin ja toisaalta ohjelman tulee voida lukea massamuistissa
olevia tietoja.
-
Ohjelman kirjoittaman tekstin ulkoasuun voidaan vaikuttaa. Tähän
liittyviä asioita ovat mm. tekstin rivi- ja sarakerakenteen ohjaaminen.
-
Matemaattisten asioiden ilmaiseminen. Tähän liittyvät:
-
laskutoimitukset
-
matemaattiset lausekkeet
-
matemaattiset funktiot
-
Tiedon vertailu
-
Erityyppisille tiedoille tarvitaan kullekin mahdollisuus todeta tiedon
yhtäsuuruus ja erisuuruus.
-
Vertailujen tuloksena saadaan loogisia arvoja tosi tai epätosi. Näitä
loogisia arvoja täytyy voida yhdistellä lausekkeiksi. Esimerkiksi
halutaan tutkia, onko muuttujan arvo välillä 0-10
-
(a > 0) and (a < 10).
-
Erityyppisille tiedoille tarvitaan myös järjestysrelaatio, jotta
voidaan verrata tietojen keskinäistä suhdetta. Luvuilla on luonnollinen
järjestys ja kirjaimilla aakkosjärjestys, mutta järjestys
voidaan määritellä myös muille merkeille tai tiedon
esitystavoille.
-
Päättely ja ohjelman käskyjen suoritusjärjestyksen
kontrollointi
-
Ohjelman käskyillä tulee olla jokin suoritusjärjestys.
-
Ohjelmassa tarvitaan ehdollisia käskyjä. Tietokone suorittaa
halutut toimenpiteet vain, jos tietty ehto on voimassa.
-
Ohjelmassa tulee voida toistaa käskyjä määräkerrat
tai niin kauan, kuin tietty ehto on voimassa.
-
Ohjelman rakenteen määrittely
-
Käskyjoukkoja tulee voida koota suuremmiksi kokonaisuuksiksi. Suuren
ohjelman rakentamista ei voida hallita, jollei ohjelmalle voida muodostaa
jonkinlaista hierarkiaa.
-
Samasta syystä ohjelman osat tulee voida eriyttää itsenäisiksi
kokonaisuuksiksi, jolloin ne voidaan toteuttaa toisistaan erillään.
-
Tiedon suojaaminen
-
Ohjelman eri osat tulee voida eristää toisistaan, etteivät
ohjelman käsittelemät tiedot pääse sekaantumaan vahingossa.
-
Ohjelmointikielen määrittely
-
Ohjelmointikielen rakenteilla on täsmällisesti määrittely
esitystapa, jolla tarkoitetaan sitä, missä järjestyksessä
kielen symbolit esiintyvät. Esimerkiksi Pascal-ohjelman otsikko alkaa
sanalla program, jota seuraa ohjelman nimi, jota seuraa tarvittaessa
vasen kaarisulku, jne.
-
Ohjelmointikielen rakenteiden toiminta määritellään
yhtä täsmällisesti. Tähän asiaan kuuluu esimerkiksi
se, että jos
-
if -sanaa seuraavan lausekkeen arvo on tosi, suoritetaan
-
then-sanaa seuraava käsky, muutoin
-
else-sanaa seuraava käsky, ei koskaan molempia.
Yllä olevat asiat liittyvät kaikkiin ohjelmointikieliin, mutta
niiden toteutustapa vaihtelee paljon. Tässä kirjassa keskitytään
Pascal-ohjelmointikieleen, mutta siellä täällä tuodaan
esille näkökohtia, jotka ovat voimassa laajemminkin.
3.4 Miten ohjelmointikieli "toimii"?
Tietokoneet eivät erikoislaitteistoja lukuun ottamatta ymmärrä
korkean tason ohjelmointikieliä tai edes assembleria sellaisenaan.
Niillä kirjoitetut ohjelmat ovat koneen kannalta pelkkää
tekstiä, joka täytyy ensin muuntaa koneen ymmärtämään
muotoon konekielelle. Kyseistä muunnosprosessia kutsutaan ohjelman
kääntämiseksi
ja sen suorittavaa ohjelmaa ohjelmointikielen
kääntäjäksi . Käännettäessä
koko ohjelmasta tuotetaan uusi kone- kielinen versio, ajokelpoinen
ohjelma. Ohjelman merkitys ei muutu tässä prosessissa,
joten binäärilukuina oleva
ohjelma suorittaa saman tehtävän kuin ohjelmoijan kirjoittama
ohjelma.
Kun ohjelma on muunnettu konekieliseksi, sitä suoritetaan samojen
periaatteiden mukaan, kuin edellä on kuvattu kohdassa 3.1. Ohjelman
tarvitsemat tiedot eli data luetaan joltakin syöttölaitteelta
ja tulostettavat tiedot siirretään jollekin tulostuslaitteelle.Ks.
kuvio 3-3. Kuviossa 3-4 on otettu mukaan myös ohjelman kääntäminen.
Kuvio 3-3: Ohjelman ajaminen.
Tietokoneohjelmissa esiintyy usein virheitä, joiden vuoksi ohjelma
toimii väärin tai ei toimi lainkaan. Niille on olemassa kolmenlaisia
syitä. Ensinnäkin ohjelmoija voi kirjoittaa ohjelmaansa ilmauksen,
joka ei ole ohjelmointikielen sääntöjen mukainen. Kyseessä
on tällöin ns. kielioppi- eli syntaksivirhe , esimerkiksi
ohjelmalta puuttuu otsikko. Tällaisista virheistä saadaan yleensä
kääntäjältä käännösaikainen
virheilmoitus , eikä ohjelmaa voi suorittaa, ennen kuin virhe
on korjattu. Toinen virhelähde on se, että ohjelmalla
yritetään tehdä jotain selvästi mahdotonta, esimerkiksi
jakaa nollalla. Ajonaikaiset virhetilanteet huomataan vasta ohjelman
suorituksen aikana ja niistä saatava ilmoitus on ns. ajonaikainen
virheilmoitus.
Kolmantena virhelähteenä ovat tilanteet, joissa ohjelmoija
on miettinyt ohjelman logiikan virheellisesti: ohjelma ei teekään
sitä, mitä ohjelmoija luulee sen tekevän. Näistä
ns. loogisista virheistä ei tule välttämättä
mitään ilmoitusta, vaan virhe
havaitaan vain vääristä lopputuloksista. Tietysti ne
voivat johtaa myös ajonaikaisiin virhetilanteisiin. Loogisten virheiden
löytäminen edellyttää ohjelman perusteellista testausta.
Ohjelma, josta ei tule käännösaikaisia tai ajonaikaisia
virheitä, ei välttämättä ole virheetön.
Kuvio 3-4: Ohjelman kääntäminen ja ajaminen.
Kuvio 3-5: Ohjelman kääntäminen ja ajaminen.
3.5 Kertaus
-
Tietokoneen tehtävänä on lukea tietoja, käsitellä
niitä ja tulostaa lopputulokset. Näitä varten koneessa on
suoritin, keskusmuisti ja oheislaitteita.
-
Tietokone on ohjelmoitavissa.
-
Tiedon esittäminen tietokoneessa perustuu kaksijärjestelmään,
perusyksikkönä bitti, suurempina yksikköinä tavu ja
sana.
-
Keskusmuisti koostuu perättäisistä muistipaikoista, jotka
erotetaan toisistaan osoitteensa perusteella.
-
Ihminen ja kone voivat kommunikoida ohjelmointikielen avulla, koska se
on täsmällisesti ja yksiselitteisesti määritelty. Ohjelmointikieliä
on monia erilaisia.
-
Ohjelmointikielissä olevat käsitteet ja toiminnot nousevat niistä
tarpeista ja vaatimuksista, joita tietokoneelle asetetaan. Matalan ja korkean
tason kielissä on tästä johtuen samoja perustoimintoja,
mutta korkean tason kielen toiminnot ovat yleisempiä, eivätkä
liity mihinkään erityiseen suorittimeen.
-
Ohjelmointikielellä kirjoitettu ohjelma täytyy muuntaa konekielelle,
ennen kuin sitä voidaan ajaa.
Ohjelmassa olevista virheistä voidaan saada käännösaikaisia
ja ajonaikaisia virheilmoituksia, mutta näiden puuttuminen ei takaa
ohjelman virheettömyyttä.
Käsitteitä
Ajonaikainen virhetilanne (run-time error)
-
Tilanne, jossa ohjelman suorituksen aikana esiintyy virheellinen toiminto,
esim. luvun jakaminen nollalla. Mikäli järjestelmä huomaa
virheen, se antaa ajonaikaisen virheilmoituksen (run time error message).
Assembler eli symbolinen konekieli (assembly language)
-
Kieli, jossa konekielen eri käskyt ja niihin liittyvät argumentit
on kirjoitettu tekstinä.
Binääriluku (binary number)
Bitti (bit, binary digit)
-
Tietokoneessa esitettävän tiedon pienin perusyksikkö.
Data (data)
-
Ohjelman käsittelemä tieto.
Keskusmuisti (main memory)
-
Muisti, jonne suoritin voi välittömästi ja nopeasti tallentaa
tai lukea tietoa.
Keskusyksikkö (central processing unit, cpu)
-
Suoritin ja keskusmuisti yhdessä.
Kilo (kilo)
-
Muistin koon yksikkö. 210 eli 1024 sanaa tai tavua.
Konekieli (machine language)
-
Suorittimen ymmärtämät binääriset komennot.
Koneriippumattomuus (machine independence)
-
Ohjelman toimintojen riippumattomuus tietokoneen erityisominaisuuksista.
Korkean tason kieli (high level language)
-
Ohjelmointikieli, joka ei perustu mihinkään erityiseen suorittimeen,
vaan jonka käsitteet ja operaatiot ovat korkeammalla abstraktiotasolla.
Käskykanta (instruction set)
-
Suorittimen ymmärtämien binääristen komentojen joukko.
Käännösaikainen virheilmoitus (compile-time error message)
-
Kääntäjän antama ilmoitus, kun se huomaa tietokoneohjelmassa
ohjelmointikielen sääntöjen vastaisen ilmauksen.
Kääntäjä (compiler)
-
Tietokoneohjelma, joka osaa muuntaa tekstimuotoisen tietokoneohjelman konekielelle.
Looginen virhe (logical error)
-
Ohjelmassa oleva virhe, jonka seurauksena ohjelma tekee jotain muuta, kuin
ohjelmoija oli alunperin tarkoittanut.
Luonnollinen kieli (natural language)
-
Ihmisten välisessä kommunikaatiossa käytetty kieli.
Massamuisti (mass storage)
-
Laite tai tallennusväline, jonne voidaan tallentaa suuria määriä
tietoa ja jossa tieto säilyy, vaikka laitteessa ei tilapäisesti
olisi sähkövirtaa.
Matalan tason kieli (low level language)
-
Ohjelmointikieli, jonka rakenteet perustuvat olennaisesti tietyn suorittimen
käskykantaan.
Mega (mega)
-
Muistin koon yksikkö. 220 yksikköä eli 1024 kilosanaa tai
kilotavua.
Muistiosoite (memory address)
-
Keskusmuistiin liittyvä menetelmä, jonka avulla voidaan osoittaa
mikä tahansa haluttu muistipaikka.
Muistipaikka (memory location)
-
Keskusmuistissa oleva muistisana.
Oheislaite (peripheral device)
-
Tietokoneeseen liitettävä apulaite, jonka avulla tietokone voi
tallentaa tietoa pysyvästi (muistilaite) tai kommunikoida ulkomaailman
kanssa (syöttö- tai tulostuslaite).
Ohjelman kääntäminen (compiling a program)
-
Tekstimuotoisen ohjelman muuntaminen konekielelle.
Rekisteri, akku (register, accumalator)
-
Suorittimen sisällä oleva muistipaikka.
Sana (word)
-
Muistin perusyksikkö, joka koostuu yhdestä tai useammasta tavusta.
Sananpituus (word length)
-
Tietokoneen muistisanan bittien lukumäärä.
Suoritin eli prosessori (processor)
-
Tietokoneen keskeisin osa, joka osaa suorittaa ohjelmia.
Syöttölaite (input device)
-
Oheislaite, jolla siirretään tietoa ulkomaailmasta tietokoneelle,
esim. näppäimistö.
Tavu (byte)
-
Muistin perusyksikkö, joka koostuu yleensä kahdeksasta bitistä.
Tulostuslaite (output device)
-
Oheislaite, jolla siirretään tietoa tietokoneesta ulkomaailmaan,
esim. kirjoitin.
Harjoitustehtäviä
-
Ota selvää, miten seuraavia laitteita käytetään
ja miten ne toimivat:
-
levykeasema
-
kovalevy
-
hiiri.
-
Selvitä jostakin tietokoneesta seuraavat ominaisuudet:
-
keskusmuistin koko
-
sananpituus
-
koneeseen liitettävät oheislaitteet.
-
Voidaanko seuraavia asioita pitää kohdassa 3.1.1 olevien vaatimusten
pohjalta tietokoneina? Perustele vastauksesi.
-
nelilaskin
-
kaupan elektroninen vaaka
-
ihmisaivot
-
hiiren aivot?
-
Ovatko seuraavat ilmaukset mielestäsi täsmällisiä ja
yksiselitteisiä. Jos eivät ole, miksi?
-
"Matti kävelee joka päivä kouluun puolen kilometrin päähän."
-
"Tietokoneen osat ovat suoritin, keskusmuisti, näppäimistö
ja monitori."
-
"Koeputkessa olevaan liuokseen sekoitetaan 2.75 g NaOH:ta"
-
"Ohjelma hyppää seuraavaksi muistipaikkaan 37 ja suorittaa siinä
olevan käskyn."
-
Vertaa kohdassa 3.1.2 olevaa Pascal-ohjelmaa ja esitettyä konekielistä
ohjelmaa. Mitkä konekielen käskyt vastaavat kutakin Pascal-kielistä
käskyä?