K (ohjelmointikieli)

**K** on tulkkaava ohjelmointikieli, joka syntyi vuoden 1990 seutuvilla, julkaistiin tuotantoon 1992 ratkaisuna Suomen valtion palkka- ja henkilöstöhallinnon monimutkaisuudelle eri virastojen välillä. Uusi HeVi-järjestelmä oli ohjelmoitu C-kielellä, jolloin erilaisten sääntöjen korjauksen levitys virastojen palvelimille oli työllistävä projekti, kun laskentasäännöissä havaittiin korjattavaa.

Karjalan Tietovallan (KaTi) ohjelmistokehityksestä vastasi 1980-luvun lopulla virkavapaalla Joensuun yliopiston tietojenkäsittelylaitoksen professorin virasta ollut Jorma Sajaniemi. Hän esitti Jukka Inkerille ideansa, joka mahdollistaisi sen, että virastot itse ylläpitäisivät järjestelmän sääntöjä dynaamisesti ilman, että KaTin tarvitsisi tehdä ohjelmistoon muutoksia. Inkeri ei ollut ennen tehnyt ohjelmointikieltä, mutta otti haasteen vastaan ja perehtyi tulkkaavan ohjelmointikielen tekemiseen.

Oli tarvetta runsaasta määrästä pienistä säännöistä, kuten ”*jos sääntö totta niin ... muulloin ...”*. Ohjelmointikieli toimi teknisesti niin, että C-kielinen ohjelmisto kutsuu K-kieli-tulkkia dynaamisen säännön nimellä. Tehokkuuteen kehitettiin niin sanottu bind-menetelmä, joka oli muutenkin jo käytössä. Siinä dataelementti on vain kerran olemassa. Tämä tarkoitti sitä, että K-kielen ja C-kielisen ohjelman välillä oli yhteinen symbolitaulu. Kaikki data oli kummankin käytössä ilman, että kummankaan tarvitsi kopioida, tarjota argumenttejä tai muuta vastaavaa. 

KaTi:ssa ei käytetty PSQL:ää tai muita SQL-kieliä välissä, vaan kaikki operointi tehtiin suoraan tietokannan rakenteisiin tietokannan kirjastoilla. Isojakaan tietojoukkoja ei siirretty kannan ja ohjelman välillä, vaan ohjelma käytti tietokannan jaettua muistialuetta suoraan. Tämän vuoksi kaikilla oli siihen tuki; Oracle tai Ingres olivat pääsääntöisesti tietokantamoottoreina.

Vaihtoehtona oli tutkittu relaatiosääntötaulua, jossa olisi matriisina valmiita sääntöjä, joista virasto valitsisi itselleen sopivat. Matriisimallista olisi tullut valtava ja liian monimutkainen hallita, joten se hylättiin. 

Suomessa oli jo valmiiksi h-kieli. Sajaniemen idea oli, että k-kieli tulee olemaan niin paljon voimaakkampi ja lähellä luonnollista suomen kieltä, että sen nimessä voidaan hypätä muutaman aakkosen yli. Siksi se nimettiin K-kieleksi.

## Esimerkki

**Esimerkki 1:**
Yksinkertainen kannasta haku ja kantakenttien jatkokäyttö.

```
/* testi20.k */ 
        $paate="ANSI"; 
        /* avoimeen kantayhteyteen haetaan rivi, valitaan kolme kenttää sijoittaen ne vastaaviin muuttujiin */
        $eka,$toka,$kolmas = select name,type,lines from crt where  
                name = '$paate' endsql; 
        tulosta "***********************************************^J"; 
        tulosta $eka,"^J"; 
        tulosta $toka,"^J"; 
        tulosta $kolmas,"^J"; 
        tulosta "***********************************************^J"; 
        lopeta;
```


**Esimerkki 2:**
Esimerkki tietokanta hausta, jossa tuloksena joukko relaation rivejä.
Toisto rakenteella jokaiselle ... seuraava käydään tulosjoukko läpi rivi kerrallaan.
sql_date funktio luotiin perinteiseen päivämäärähaasteeseen. Eri tietokannoissa pvm:t esitettiin eri tavalla.
K-kielen oma sql_date hallitsi eri tietokantojen "date" erot. Tavoite oli, että päästään eroon pvm ongelmista. 
Päästiin. Säännönkirjoittajan tarvitsi osata suomalainen pvm esitysmuoto. Loput hoiti K-kieli taustalla.


```
/* testi30.k */
        $k=0; 
        jokaiselle -- jokaiselle pyörii fetch +1 kertaa !!!  
                $hnro,$lyhnim,$syntaik,$pvm=select henknro,lyhnim,syntaik, sysdate from henkilo where syntaik =  
                        sql_date('09.11.1991')  
                        endsql; 
                $k=$k+1; 
                tulosta "X",$hnro,$lyhnim,$syntaik,":",$pvm,"^J"; 
        seuraava; 
        tulosta "STOP lukumäärä <",$k,">^J"; 
        tulosta "VIIM:",$hnro,$lyhnim,$syntaik,":",$pvm,"^J"; 
        lopeta;
```


**Esimerkki 3:**
Tässä on C-kielinen ohjelma, josta kutsutaan datajoukolla, lista.
K-tulkki saa ko. listan osoittimen lähtöarvona, tekee sille K:lla ohjelman "teetama1.k", 
jonka listarakenetinen tulosjoukko käsitellään C-kielessä.

```c
/* suoritetaan K-ohjelma */ 
        reload=FALSE; 
        ok=K_do(PAR_LST,"teetama1.k",ARV_LST,testi,reload); 
        if (!ok) { 
                fprintf(stderr,"Error:%s Ön",K_get_error()); 
                }

        /* luetaan arvolista */ 
        ok=scref_search_listline(ARV_LST,FIRST); 
        i=1; 
        printf("\n----------------------------------------------\n"); 
        printf("\nPalautusarvot --------------------------------\n"); 
        while(ok) {
                lkm=atoi(scref_get_listtext(ARV_LST,1));  /* mja lkm */ 
                for(j=1;j<=lkm;j++) {
                   /* katsotaan arvot */ 
                   strcpy(arvo,scref_get_listtext(ARV_LST,1+j)); 
                   printf("(%3d):<%s> \n",j,arvo); 
                   }
                printf("-------------+++++----++++-----+---+++\n"); 
                ok=scref_search_listline(ARV_LST,NEXT); 
                i++; 
                }
        /* katsotaan muuttujan $henk viimeinen arvo K-kielen symbolitaulusta */ 
        K_get_var("$henk",muuttujanarvo); 
        printf("$henk = %s \n",muuttujanarvo);
```


## Lähteet
* K-kielen käsikirja