Tiedetöppäysjoulukalenteri: 5. Nollaosoitin

Tony Hoare (kuvassa oikealla) ei ollut pahantahtoinen mies, vaikka hän sai aikaan erään tietokoneajan historian suurimmista ongelmista. Hän halusi ratkaista ongelman, mutta loi samalla uuden, vielä suuremman – tosin se muodostui hankalaksi vasta myöhemmin.

05.12.2019

ALGOL on tietokoneiden ohjelmointikieli, jonka kehittäminen alkoi 1950-luvun lopussa. Joukko amerikkalaisia ja eurooppalaisia tiedonkäsittelytieteen tutkijoita piti seminaarin Zürichissä ja kehitti siellä ALGOL 58 -nimellä tunnetun ohjelmointikielen. 

Se ei tullut koskaan laajempaan käyttöön, mutta oli 1960-luvulla hyvin suosittu tutkijoiden parissa. Matematiikassa ja tietokonetieteessä sitä ja sen johdannaisia käytettiin 1990-luvulle saakka, joskin kaikkein tärkein ALGOLin merkitys oli sen vaikutus muihin ohjelmointikieliin.

Näitä ovat Simula, Pascal, Ada ja C, joka on suora esivanhempi esimerkiksi tämän nettisivun näyttämisessä tarvittavalle PHP-koodille. Netti – sellaisena kun sen nyt tunnemme – kiittää ALGOLia, sillä lähes kaikki serverit hyrräävät PHP:n ystävällisellä myötävaikutuksella.

Yksi ALGOLin variantti oli ALGOL W, jonka tekemiseen osallistui brittiläinen Tony Hoare. Hänen keksintönsä oli ohjelmointikieleen lisätty niin sanottu nollaosoitin, eli "tyhjä" -osoitin.

Osoitin on tietotyyppi, joka viittaa tietokoneen keskusmuistissa sijaitsevaan arvoon. Ja kun osoittimelle annetaan arvoksi null, eli "tyhjä", niin osoitin ei osoita minnekään. Kun tietokoneet eivät olleet kovin suorituskykyisiä, oli sen avulla kätevää kertoa esimerkiksi se, että muisti on loppumassa.

int *p = nullptr; (*p) = 42; // vikatilanne: osoitin ei ole validi osoite

Sittemmin tämä nollaosoitin on aiheuttanut paljon harmia ja lisätyötä, koska ohjelmat kaatuivat osoittimen osoittaessa ei minnekään.

Tony Hoare muisteli vuonna 2009 – nyt aateloituna ja palkittuna alan guruna –  tätä legendan mukaan miljardien dollarien menetyksiä aiheuttanutta keksintöään:

"Keksin nollaosoittimen vuonna 1965, ja tavoitteenani oli se, että kaikki osoittimet olisivat ehdottoman turvallisia siten, että kääntäjä tarkistaisi ne automaattisesti."

"En kuitenkaan voinut välttää kiusausta laittaa mukaan nollareferenssiä, viittausta ei minnekään, koska se oli niin helppo toteuttaa."

Hoaren tavoitteena oli saada tietokoneet toimimaan nopeammin. Tuohon aikaan hän oli työssä Elliot Brothers -yhtiössä kehittämässä ALGOLista mahdollisesti pankeissa, vakuutusyhtiöissä ja muuallakin kaupallisessa maailmassa käytettyä ohjelmointikieltä, jonka kirjoittaminen olisi aiempaa helpompaa.

Osana tätä olivat kikat, joiden avulla tavallisten käyttäjien ei täytynyt keskittyä konekielisen ohjelmoinnin yksityiskohtiin. Tämän vuoksi ohjelma tarkisti sitä minne koodissa olevat osoittimet osoittivat keskusmuistissa, mutta tähän kului aikaa ja kallista (tuolloin aivan konkreettisen kallista) tietokonekapasiteettia.

Niinpä Hoare keksi nollaosoittimen, käskyn, joka sanoi ettei se osoita mihinkään. Yleistäen kyse oli siitä, että kone saatiin toimimaan nopeammin, mutta se saattoi myös kaatua joskus.

Suo siellä, vetelä täällä.

"Nollaosoittimen vuoksi on tullut lukemattomia virheitä, haavoittuvuuksia ja systeemien kaatumisia, jotka ovat saaneet aikaan 40 vuoden aikana miljardien dollarien edestä vahinkoja ja harmia."

Suurin yksittäinen haitta oli CodeRed -nimellä tunnettu mato, jonka nollaosoitin teki mahdolliseksi. Sen leviäminen alkoi vuonna 2001 ja se sai aikaan maailmanlaajuisesti noin neljän miljardin dollarin edestä vahinkoja servereissä ympäri maailman.

Nyttemmin nollaosoittimet on luonnollisesti korjattu, mutta harmina ovat puolestaan muut vastaavat.

Toinen todella kallis tietokonetöppäys on kuuluisa Y2K, vuosituhannen vaihtuminen. Tietokoneiden päivämäärätiedot oli alkujaan tehty muistitilaa säästäen siten, että ne olivat automaattisesti 1900-luvulla. Eli vuosi 1985 kirjoitettiin vain 85, tai vastaavasti. Tämän korjaamiseen (Hoaren mukaan) on käytetty myös noin neljä miljardia dollaria.

CodeRedin saastuttama tietokone

 

Jos haluat heittäytyä ammoisten tietokonekielien maailmaan, niin John Backusin ammoinen artikkeli ALGOL kieliopista (PDF) on kiinnostava.

PS. Tämän kalenteriluukun julkaisu lykkääntyi siksi, että tietokoneohelmasta kertovan jutun julkaisu sai aikaan häiriöitä systeemissämme. Onkohan näillä joku yhteys?

Tiedetöppäysjoulukalenteri

Tiedetuubin joulukalenteri vuonna 2019 esittelee tieteellisiä töppäyksiä sekä erehdyksiä: tietoisia huijauksia, puhtaita vahinkoja ja myös varsin onnekkaiksi osoittautuneita epäonnistumisia. Ne auttavat myös ymmärtämään miten tiede toimii – ja että tutkijatkin ovat ihmisiä.

Kaikki avautuneet luukut ovat täällä.