Datatekniikan "kielet" - ehdotus käsitteiden selvennykseksi ja luokitteluksi

Sana kieli on tullut datatekniikan (ATK:n, IT:n) alalla erittäin väljään käyttöön, mikä aiheuttaa jatkuvia käsitesekaannuksia, oppimisvaikeuksia ja tarpeettomia erimielisyyksiä. Sama koskee alakäsitteiden kuten ohjelmointikieli käyttöä, esimerkiksi ASP:n tai HTML:n kutsumista ohjelmointikieliksi. Tämä dokumentti pyrkii yleisen käsitteiden selventämisen lisäksi esittämään käytännöllisen tavan luokitella "kieliä", jotta tiedettäisiin edes suunnilleen, mistä milloinkin on puhe.

Kieliä joka lähtöön

Jo ennen datatekniikan syntyä sanalla kieli oli monta käyttöä. Sen lisäksi, että se tarkoittaa konkreettisesti tiettyä elintä, se viittaa ensisijaisesti ihmisten käyttämiin erityisiin viestinnän muotoihin, puhekieliin kuten suomi, ruotsi ja japani ja niiden kirjoitettuihin vastineisiin. Toissijaisesti ja kuvaannollisesti on puhuttu esimerkiksi "kehon kielestä" (body language), eläinten "kielistä" ja kuvaamataiteen "muotokielestä". Tästä ei vielä seurannut paljoakaan ongelmia; yleensä oli asiayhteyden ja asiasisällön perusteella selvää, minkätyyppiseen asiaan sana kieli kulloinkin viittaa.

Mutta tietokoneiden kehittämisen myötä ruvettiin "kieliksi" kutsumaan myös monia muita asioita, kuten "ohjelmointikieliä", "komentokieliä", "kyselykieliä", "merkkauskieliä" ym. Yhteys sanan kieli vanhoihin merkityksiin on usein varsin heikko. Usein kyse on vain merkintätavasta, notaatiosta, jota on ruvettu kutsumaan "kieleksi". Eräissä yhteyksissä (formaalien kielten yleisessä teoriassa) sana kieli määritelläänkin tämän pohjalta: kieli on mikä hyvänsä merkkijonojen joukko. Esimerkiksi lukujen tavanomaista esittäminen numerojonoina (kuten 42) on tältä kannalta "kieli" - mutta formaalien kielten teoriassa kielellä ei edes edellytetä olevan mitään semantiikkaa eli kielen ilmaisuille (kieleen kuuluville merkkijonoille) annettuja merkityksiä. Tämä formaali lähestymistapa on toki jossakin mielessä äärimmäisyys mutta kuvaa omalla tavallaan käsitteiden venymistä. Lisäksi vaikka notaatioon yleensä liitetään jokin semantiikka, niin se, missä mielessä ilmaisuilla on merkitys, vaihtelee suuresti. Ohjelmointi- tai komentokielen ilmaisun merkitys kai se tietokoneen toiminta, joka sillä on tarkoitus saada aikaan. Mutta tämä poikkeaa ratkaisevasti esimerkiksi ns. kuvauskielestä, jonka ilmaisu kuvaa jonkin datan muodollisen rakenteen ja mahdollisesti liittää siihen jonkin sisällöllisen kuvauksen.

WWWebsterissä sanan language kuvaus osoittaa hyvin sen merkitysten moninaisuuden - ja käsitteiden sekaannuksen. Se muun muassa esittää kahtena rinnakkaisena alakohtana seuraavat:

  1. a formal system of signs and symbols (as FORTRAN or a calculus in logic) including rules for the formation and transformation of admissible expressions
  2. MACHINE LANGUAGE

joista jälkimmäinen viittaa määritelmään, jossa kuvattu "kieli" on todellisuudessa erikoistapaus edellä kuvatusta.

Sanan kieli lukemattomiin merkityksiin tuntuisi sopivan erityisen hyvin Wittgeinsteinin perheyhtäläisyyden (Familienähnlichkeit) käsite: ei voida, ainakaan kovin täsmällisesti, osoittaa joukkoa yhteisiä ominaisuuksia, joka "perheen" kaikilla jäsenillä (kaikilla "kieliksi") kutsutuilla olisi, mutta niitä yhdistävät erilaiset siteet ja erilaiset ominaisuudet, joita on useilla "perheen" jäsenillä mutta ei kaikilla.

Mitä "kieli" yleisesti tarkoittaa datatekniikassa?

Atk-sanakirjan mukaan kieli on "joukko alkioita sekä säännöstö, jota noudattaen niitä yhdistellään ja järjestetään tiedon välittämiseksi". Olisi helppo osoittaa, millaisia ongelmia tässä määritelmässä on; paremman määritelmän muotoileminen olisi jo haastavampaa.

Webopedian artikkeli sanasta language mainitsee: "In computer science, human languages are known as natural languages." Kuvaavaa on, että kun sanan kieli merkitystä on tarpeeksi väljennetty, tarvitaan erityinen lisämäärite osoittamaan, että puhutaan siitä, mikä ennen tunnettiin nimellä kieli; ja lisämäärite on myös epälooginen, koska tässä yhteydessä "luonnollisiin kieliin" kuuluviksi tosiasiassa luetaan myös ns. keinotekoiset kielet eli suunnitelmakielet kuten esperanto. Joka tapauksessa on selvää, että datatekniikankin alalla on pakko paitsi käyttää "luonnollisia kieliä" myös puhua niistä esimerkiksi viitattaessa dokumentaatioon, käyttöliittymään tai automaattiseen kielenkääntämiseen.

Atk-sanakirja esittää kielten jaottelun "tarkoituksen mukaan", pääjakona "formaali kieli" ja "luonnollinen kieli". Ensin mainittu ei tarkoita sitä, mitä se tarkoittaa formaalien kielten teoriassa vaan ylipäänsä kaikenlaisia notaatioita - paitsi luonnollisia kieliä. Voidaan kysyä, sisältyykö tähän formaalin kielen käsitteeseen jonkinasteinen kielen määrittelyn formaalisuus vai onko se tässä vain luonnollisen kielen komplementaarinen vastakohta: jos kieli ei ole luonnollinen, sitä sanotaan formaaliksi. Eihän ole käsitteellisesti mitenkään välttämätöntä, että esimerkiksi ohjelmointikielen näköinen notaatio on määritelty täsmällisesti saati formaalisti. Itse asiassa esimerkiksi algoritmien kuvauksissa käytetään usein ns. pseudokoodia, joka käyttää ohjelmointikielissä yleisiä merkintätapoja ilman, että pseudokoodia olisi varsinaisesti määritelty; luotetaan siis alaa tuntevan lukijan intuitioon.

Olisi luultavasti parasta, jos datatekniikassa kutsuttaisiin kieliksi vain "luonnollisia kieliä" ja muille "kielille" otettaisiin käyttöön jokin muu nimitys, esimerkiksi koodi (tai koodijärjestelmä), notaatio tai formalismi. Ajatus ei kuitenkaan liene realistinen, ja lisäksi vaihtoehdoilla on niilläkin huonot puolensa. Esimerkiksi sanalla koodi on jo useita (varsin erilaisia) erityismerkityksiä, ja formalismi on liian rajoittava nimitys ja lisäksi jo käytössä mm. taidesuunnan nimenä.

Kielenkäytön yleinen sekavuus ei kuitenkaan estä tarpeen mukaan käyttämästä parempia ilmaisuja. Tarvetta voi syntyä erityisesti opetuksessa ja dokumentaatiossa. Tällöin voitaisiin kieliksi kutsua vain "luonnollisia kieliä", ja yleisnimitykseksi datatekniikan "kielille" sopisi ehkä parhaiten notaatio.

Seuraavassa käsitellään notaatioiden luokittelua sekä eräitä erityiskysymyksiä.

Notaatioiden ("formaalien kielten") luokittelu

Atk-sanakirja antaa käsitteelle formaali kieli määritelmän 'kieli, jolla on ennalta määritelty täsmällinen kielioppi, ja jota ei ole tarkoitettu puhuttavaksi' ja jakaa sen seuraaviin alakäsitteisiin:

toimikieli (data processing language; executable language)
Formaali kieli, jolla voidaan esittää tietokoneen suoritettavaksi tarkoitettuja ohjelmia.
luonnoskieli (pseudo language; pseudocode)
Lausekieltä muistuttava formaali kieli ohjelmien esittämiseksi esimerkiksi kirjallisuudessa.
määrittelykieli (specification language)
Formaali kieli, joka on tarkoitettu rakenteen tai järjestelmän kuvaamiseen. Esimerkkejä: LOTOS, VDL, Z, ESTELLE, SDL, VHDL.

Jakoa sinänsä voidaan pitää melko loogisena. Mutta ongelmallista on, että "toimikieliin" on luettu monia notaatioita, joissa on tosiasiassa kyse esimerkiksi datarakenteen kuvauksesta, esim. SGML. Tarkemmin sanoen käsitteen "toimikieli" jako edelleen alakäsitteisiin on Atk-sanakirjassa seuraava:

konekieli (machine language)
Konekäskyistä koostuva formaali kieli, jolla esitetty ohjelma voidaan sellaisenaan suorittaa tietokoneella.
ohjelmointikieli (programming language)
Ohjelmien laatimiseen ja esittämiseen tarkoitettu toimikieli, joka on muunnettavissa konekielelle. Ks. Ada, Algol, APL, Basic, Cobol, C-kieli, C++, Fortran, Lisp, Pascal, PL/I, Simula.
sovelluskieli (special purpose language)
Tietylle sovellusalueelle erikoistunut toimikieli.

Kuten englanninkielisestä vastineesta ilmenee, kategoriaan "sovelluskieli" on käytännössä luettu kaikki ne "toimikieliksi" luokitellut, jotka eivät ole konekieliä eivätkä ohjelmointikieliä. Asian ongelmallisuutta kuvastaa, että kaavio Sovelluskieliä käyttötarkoituksen mukaan sisältää seuraavat (ja vielä eräitä alemman tason jaotteluja):

Viimeinen kohta osoittaa, miten hämärälle alueelle joudutaan, kun kielen käsitettä venytetään. Toki tavallaan sama ongelma kohdataan, vaikka puhuttaisiin notaatioista. Jos taulukkolaskimet ovat mukana, miksi eivät tekstinkäsittelyohjelmat? Onhan niissäkin usein varsin monipuolinen ohjauskieli. Jos näppäinkomentojen jono taikka makro, jolla hoidetaan jokin taulukkolaskenta- tai tekstinmuokkausoperaatio, on "kieli" (tai "notaatio"), niin eikö sitten aivan saman asian tekeminen graafisen käyttöliittymän menetelmin, hiirellä, painikkeilla yms.?

Parasta olisi rajata käsitettä "notaatio" tai "formaali kieli" niin, että ohjelmat sinänsä eivät kuulu sen alaan. Sen sijaan ohjelman sisällä voi olla käytössä notaatioita, kuten tekstimuotoiset komennot tai yhtä hyvin kuvakkeiden napsauttelu, tai jopa ohjelmointikieliksi luokiteltavia notaatioita.

Keskeiseksi luokitteluksi ehdotan jakoa käskynotaatioihin ja kuvailunotaatioihin. Tämä on ristikkäinen edellä lainatun luokittelun kanssa ja vastaa notaatioiden semantiikan olennaista jakoa. Jos notaatioihin liitetyt merkitykset ovat luonteeltaan käskyjä (komentoja, määräyksiä) suorittaa toimenpiteitä, kyseessä on käskynotaatio (käskykieli). Jos merkitykset taas kuvaavat esimerkiksi datarakenteita, kyse on kuvailunotaatiosta (kuvailukielestä).

Käskynotaatioihin kuuluvat edellä esitetyistä konekielet, ohjelmointikielet, ohjauskielet ja taulukkolaskimet siltä osin, kuin kyse on datan käsittelystä. Tietokantakielet ovat käskynotaatioita siltä osin, kuin kyse on tietokantahausta, tietokannan muokkauksesta tms., kun taas tietokannan kuvaus on kuvailukieltä. Myös ohjelmointikielissä voitaisiin erottaa kuvailunotaatio (esim. tietorakenteiden määrittelyt) käskynotaatioista, joskin kyse on usein vain käskynotaatioon olennaisesti liittyvistä kuvauksista, ei esim. ohjelman ulkopuolisen datarakenteen kuvauksesta sellaisena kuin se on sitä käsittelevistä ohjelmista riippumatta.

Muutenkin on huomattava, että jokin erityinen yhdeksi kokonaisuudeksi käsitetty "kieli" voi sisältää sekä kuvailunotaatioita että käskynotaatioita. Lisäksi näiden keskinäinen ero ei ole ehdoton; esimerkiksi tyylisäännöstöjä (style sheets) voitaisiin pitää käskynotaatioina (esim. h2 {color:red;} olisi käsky 'esitä 2. tason otsikot punaisella'), mutta luonnollisempaa on pitää sitä kuvailunotaationa, joka kuvaa dokumentin yhden mahdollisen esitysasun (kuten sellaisen, jossa otsikoiden väri on punainen).

Erityiskysymystä siitä, onko HTML kuvailunotaatio vai käskynotaatio, käsittelee - näitä nimityksiä käyttämättä - kirjoitukseni Programs vs. markup or why HTML authoring is not programming. Lyhyesti sanottuna kysessä on ensisijaisesti kuvailunotaatio, johon liittyy eräitä piirteitä, jotka voidaan tulkita käskynotaatioiksi (suunnilleen samassa mielessä kuin tyylisäännöstöt voidaan tulkita sellaisiksi).

Metakielet (kuten SGML, lex ym.) ovat aina luonteeltaan aina kuvailunotaatioita, siitä riippumatta, millaisen notaation ("kielen") kuvaamiseen niitä käytetään. Myös notaatio, joka formaalisti kuvaa jonkin käskynotaation käskyn merkityksen (vaikutuksen), on kuvailunotaatio; se itse ei käske mitään, vain kuvailee. (Mutta eikö sellainen kuvaus olisi käskevä, jos se olisi normatiivinen eli sisältäisi esim. ohjelmointikielen standardiin sisältyvät vaatimukset sille, miten kielen toteutuksen tulee toimia? Ei. Normatiivisuus on itse notaation ulkopuolinen asia. Esimerkiksi jokin puhelinnumeroiden esittämiseen käytettävä notaatio ei muutu kuvailunotaatiosta käskynotaatioksi, vaikka siitä tehtäisiin velvoittava standardi.)

Liitynnät (interfaces): ei kieliä ollenkaan

Melko usein viitataan esimerkiksi CGI:hin tai ASP:hen "kielinä". Tämä johtunee useimmiten siitä, että niitä käytetään yhdessä jonkin ohjelmointikielen kanssa, eikä varsinkaan aloittelija aina osaa erottaa loogisesti erillisiä asioita toisistaan silloin, kun oppii ne yhdessä ja käyttää niitä yhdessä.

CGI ja ASP ovat esimerkkejä liitynnöistä eli "rajapinnoista" (intefaces) ja niiden teknisestä toteutuksesta. Liitynnät määrittelevät, miten jollakin ohjelmointikielellä tehdyt ohjelmat "pelaavat yhteen" niiden ulkopuolisten asioiden kanssa. Esimerkiksi CGI-liityntä määrittelee, missä muodossa ja millä tavalla ohjelma, jonka palvelin suorittaa ns. CGI-skriptinä, saa lähtödatansa ja miten sen tulosteet välittyvät eteenpäin.

Ns. dynaaminen HTML (DHTML) on tarkastelukulman mukaan joko kokoelma erilaisia notaatioita (HTML, CSS, JavaScript) tai niiden välisen erityisen liitynnän määrittely eli lähinnä ns. Document Object Model (DOM).

Totta on, että liitynnöissäkin käytetään notaatioita, "kieliä", jossakin mielessä. Edellä mainituista liitynnöistä selvimmin ASP antaa tällaiseen aiheen, koska ASP:tä käytettäessä dokumenttiin liitetään erityisiä merkintöjä, joilla ikäänkuin upotetaan käskynotaatioita (esim. VBScript-käskyjä) kuvailunotaation (HTML:n) sekaan. Jos halutaan kutsua esimerkiksi tähän käytettäviä merkkipareja <% ja %> notaatioiksi tai kieleksi, on syytä pitää mielessä, että ne ovat kokonaan toisen tason notaatioita kuin ne notaatiot, joiden välisestä liitynnästä on kyse. Missään tapauksessa ne eivät muodosta ohjelmaa. Kuten irt.org:n ASP FAQ vastaa kysymykseen Is ASP a language?:

ASP is not a language like VBScript or JavaScript - it is a hosting environment that extends the normal capabilities of a web server and exposes objects for use in web programming.

Viimeisimmän päivityksen ajankohta: 2000-11-21

Jukka Korpela,