Tyyppijärjestelmä

Wikipedia
Loikkaa: valikkoon, hakuun

Ohjelmointikielen tyyppijärjestelmä määrittelee, kuinka ohjelmointikieli luokittelee arvot ja muuttujat tyyppeihin, kuinka se käsittelee näitä tyyppejä ja kuinka nämä tyypit toimivat keskenään. Tyyppi tai tietotyyppi on joukko arvoja, joilla on yleensä samanaiheinen merkitys tai yhtenevä toteutus.

Merkitys[muokkaa | muokkaa wikitekstiä]

Tietotyypit antavat tulkinnan tietokoneen muistissa oleville bittijonoille. Tavanomaisten tietokoneiden muisti koostuu järjestyksessä olevista biteistä, joiden tulkintaa on vapaa. Niinpä sama osa muistin sisältöä voidaan tulkita vaikkapa merkiksi, kokonaisluvuksi, liukuluvuksi tai osoitteeksi toiseen muistipaikkaan. Tyypit kertovat ohjelmille ja ohjelmoijille, kuinka nämä bitit tulkitaan.

Muuttujan tai arvon tyyppi määrittelee, millä tavoin se voi toimia muiden muuttujien tai arvojen kanssa. Tyyppitarkastuksessa varmistutaan siitä, että tyypit toimivat näiden rajoitusten mukaan, eli tarkastetaan osa ohjelman semantiikasta. Tyyppitarkastus voidaan suorittaa ohjelman käännösaikana (staattinen tyyppitarkastus) tai ajoaikana (dynaaminen tyyppitarkastus).

Tyyppijärjestelmä antaa seuraavia merkittäviä hyötyjä:

  • Tyyppiturvallisuus - Tyyppien ansiosta ohjelmointikielen kääntäjä tai tulkki voi tunnistaa virheitä ohjelmakoodissa. Esimerkiksi lauseke
"Hello, World" / 3

voidaan tunnistaa virheelliseksi, koska merkkijonon jakaminen kokonaisluvulla ei ole mielekäs operaatio.

  • Optimointi - Jos kääntäjä esimerkiksi tietää, että jokin muuttuja on aina 8-bittinen kokonaisluku, sen ei tarvitse varata muistista arvoa varten kahdeksaa bittiä enempää tilaa. Kääntäjä voi myös käyttää 8-bittisille kokonaisluvuille parhaiten soveltuvia konekielen käskyjä muuttujan käsittelyyn.
  • Dokumentointi - Ohjelmoija voi tyyppien huolellisella määrittelyllä ja käytöllä selventää ohjelmakoodin tarkoitusta. Tyyppijärjestelmä voi esimerkiksi mahdollistaa rahamäärää kuvaavien arvojen erottamisen paljaista reaaliluvuista. Kirjoittamalla esimerkiksi funktion paluutyypiksi rahamäärän eikä reaalilukua ohjelmoija dokumentoi osan funktion merkityksestä.
  • Abstraktointi - Tyyppien ansiosta ohjelmaa on helpompi tarkastella tietokoneen toimintojen tasoa korkeammalla abstraktiotasolla. Esimerkiksi pankkisovelluksen parissa työskentelevä ohjelmoija voi käyttää ohjelmoinnissaan ja ajattelussaan enemmän pankkialan termistöä ja vähemmän tietokoneen teknisten yksityiskohtien termistöä.

Staattinen vs. dynaaminen tyypitys[muokkaa | muokkaa wikitekstiä]

Tyyppijärjestelmä voi olla staattinen tai dynaaminen. Edellisessä objektien tyypit ovat tiedossa jo käännösvaiheessa, jälkimmäisessä tyyppi voi muuttua ajonaikaisesti. Esimerkiksi C-kielen tyyppijärjestelmä on staattinen, koska muuttujien tyypit on pakko antaa muuttuja- ja funktioesittelyiden yhteydessä. Sen sijaan useimmat tulkattavat (eivät kuitenkaan kaikki) kielet ovat dynaamisesti tyypittäviä kieliä, kuten Perl ja Python. Esimerkiksi seuraava ohjelmakoodinpätkä on laillista Pythonia ja voisi olla mielekäs osa jotain ohjelmaa:

def parse_arg(index):
    count, filename = ARGV[0], ARGV[1]
    count = int(count)
    return count, filename

Aluksi count on tässä merkkijonotyyppinen, koska taulukon ARGV (komentoriviargumentit ) alkiot ovat merkkijonoja. Seuraavalla rivillä count muunnetaan integer-tyyppiseksi ennen return -lausetta. Muuttujan count tyyppi siis vaihtuu ajonaikana, mutta siitä ei aiheudu virhettä.

Dynaaminen tyypitys tarjoaa joustavuutta, mutta se ei ole automaattisesti staattista tyypitystä parempi ratkaisu. Staattisen tyyppijärjestelmän avulla monet virheet voidaan havaita käännösaikana, kun taas dynaamisesti tyypitetyssä kielessä vastaava virhe havaitaan vasta ajon aikana.