Digitaaliset tietokoneet eivät ymmärrä ihmisten puhumia kieliä. Sen sijaan ne käyttävät binäärikieltä, jota kutsutaan konekoodiksi tai konekieleksi.Konekoodi koostuu yksinkertaisten tietokonekäskyjen sarjasta, jossa kukin käsky ilmaistaan binääristen numeroiden tai bittien (eli ykkösten ja nollien) sarjana. Eri tietokoneet tyypillisesti ”puhuvat” tai ”ymmärtävät” eri konekieliä. Esimerkiksi yksi tietokone voi esittää ADD-operaation muodossa 10011111, kun taas toinen saattaa esittää samat operaatiot muodossa 000110. Sen lisäksi, että bittikuviot ovat tyypillisesti erilaisia tietokonetyypeittäin, jopa operaation esittämiseen käytettävien bittien määrä voi olla erilainen.

Kun ohjelma suoritetaan, käyttöjärjestelmä (esim. Windows, Linux, OS X jne.) toimii isäntäympäristönä, joka tarjoaa ohjelmalle palveluita.Näihin palveluihin kuuluu olennainen tuki, kuten pääsy näppäimistöön, näyttöön ja kiintolevyihin. Valitettavasti myös se, miten ohjelma käyttää näitä palveluja, eroaa käyttöjärjestelmästä toiseen. Konekielten ja käyttöjärjestelmän vaatimusten välisten erojen vuoksi konekielellä kirjoitetut ohjelmat keskittyvät enemmän ohjelmaa käyttävään järjestelmään kuin siihen, miten ohjelma ratkaisee ongelman. Lisäksi se tarkoittaa, että konekoodia ei ole mahdollista siirtää eri tietokoneiden välillä ilman jonkinlaista käännöspalvelua – yleensä virtuaalikoneen muodossa.

Konekielisten ohjelmien kirjoittaminen on hidasta, työlästä ja virhealtista. Ratkaisu oli kehittää korkeamman tason ohjelmointikieliä, joissa keskityttiin enemmän ongelmaan ja vähemmän järjestelmään (laitteistoon ja käyttöjärjestelmään), jossa ohjelma suoritetaan (ks. kuva 2). Tietokoneet eivät kuitenkaan yleensä suorita korkean tason ohjelmointikielillä kirjoitettuja ohjelmia, joten on oltava jokin tapa kääntää korkean tason kielellä kirjoitettu ohjelma konekielelle. Tarvittavan käännöksen suorittavat kahdenlaiset tietokoneohjelmat: kääntäjät ja tulkit.

Kääntäjä on ohjelma, joka kääntää korkeatasoisella ohjelmointikielellä, kuten C:llä tai C++:lla, kirjoitetut muut ohjelmat konekoodiksi tai konekieleksi.Muut kielet, kuten Java ja C#, kulkevat eri reittiä: Näillä kielillä kirjoitetut ohjelmat käännetään väliesitykseen (esitys, joka on jossain korkean tason kielen ja konekielen välissä), jota kutsutaan usein virtuaalikoneohjelmaksi. Virtuaalikonekoodista tulee sitten syötettä toiselle ohjelmalle, jota kutsutaan tulkiksi tai virtuaalikoneeksi (VM, ohjelma, joka simuloi laitteistosuorittimen). Jotkin kielet, kuten Javascript ja Perl, ovat täysin tulkattuja, eli niitä ei käännetä, vaan ne tulkitaan suoraan.

Kuvassa näkyy kääntäjä, joka lukee C++-lähdekooditiedoston, kääntää C++-koodin konekoodiksi ja kirjoittaa konekoodin ulos suoritettavaan tiedostoon.
Käännetyllä kielellä kirjoitetun ohjelman kääntäminen tai muuntaminen konekoodiksi. Kääntäjä lukee C++-lähdekoodin tiedostosta, joka päättyy .cpp, ja tuottaa konekooditiedoston, joka onsuorituskelpoinen. Windows-tietokoneissa C++-kääntäjän tuottamien suoritettavien tiedostojen pääte on .exe; muut käyttöjärjestelmät noudattavat erilaisia nimeämiskäytäntöjä. Käyttöjärjestelmät pystyvät ajamaan suoritettavia tiedostoja ilman jatkokäsittelyä.
Kuvassa kääntäjä lukee Java-lähdekooditiedoston ja kääntää Java-koodin virtuaalikonekoodiksi, joka tallennetaan uuteen tiedostoon. Virtuaalikone, toinen ohjelma, lukee virtuaalikonekoodin uudesta tiedostosta ja tulkitsee sen suorittaakseen virtuaalikonekoodin määrittelemät operaatiot.
Virtuaalikonekoodia tuottavalla kielellä kirjoitetun ohjelman kääntäminen ja ajaminen. Javan ja C#:n kaltaiset kielet käännetään ensin virtuaalikonekoodiksi eli konekoodiksi virtuaalitietokoneelle – tietokoneelle, jota ei todellisuudessa ole olemassa. Kun lähdekoodi on käännetty, virtuaalikoneeksi (VM) kutsuttu ohjelma suorittaa koodin simuloimalla todellisen tietokoneen toimintoja. Käyttöjärjestelmä ajaa VM:ää.
Kuva illistää Javascript-lähdekooditiedostoa, jota tulkki lukee ja käsittelee.
Puhtaasti tulkatulla kielellä kirjoitetun ohjelman suorittaminen. Javascriptin ja Perlin kaltaisia kieliä ei käännetä lainkaan. Tulkiksi kutsuttu ohjelma lukee lähdekooditiedoston lauseke kerrallaan ja toteuttaa tai tulkitsee jokaisen lausekkeen sitä mukaa kuin se luetaan kääntämättä sitä millekään muulle kielelle. Javascript-tulkki on sisällytetty useimpiin verkkoselaimiin, joita käyttöjärjestelmä käyttää. Muiden tulkattujen kielten osalta käyttöjärjestelmä ajaa tulkin sovellusohjelmana.

Kullakin lähestymistavalla korkean tason ohjelmointikielellä kirjoitetun ohjelman ajamiseen on etuja ja haittoja. Täysin käännetyillä kielillä (esim. C ja C++) kirjoitetut ohjelmat suoritetaan nopeammin kuin osittain käännetyillä kielillä (esim. Java ja C#) kirjoitetut ohjelmat ja ne suoritetaan paljon nopeammin kuin täysin tulkatuilla kielillä (esim. Javascript ja Perl) kirjoitetut ohjelmat. Jotta suorituskyvyn erosta saataisiin käsitys, oletetaan, että käännetty C++-ohjelma suoritetaan ajassa 1,0. Vastaava ohjelma, joka on kirjoitettu kielellä, joka on käännetty ja sitten tulkattu, suoritetaan yleensä ajassa 3-10. Sama ohjelma, joka suoritetaan puhtaasti tulkatulla kielellä, suoritetaan ajassa noin 100. Javan ja C#:n VM:ien nykytoteutuksissa käytetään JIT-tulkkia (just in time), joka kääntää osan virtuaalikoodista konekoodiksi sen käsittelyn aikana. JIT-prosessorit lyhentävät suoritusaikaa noin 1,5-kertaiseksi puhtaasti käännettyihin kielijärjestelmiin verrattuna. Python-ohjelmointikieli on hieman erilainen: Python-ohjelman pääosa on tulkattu, mutta se on suhteellisen pieni, joten sen vaikutus kokonaisajoaikaan on vähäinen. Suurin osa Python-kirjastoista, joissa ohjelma viettää suurimman osan ajastaan, on kirjoitettu C-kielellä, joten Python-ohjelmat toimivat lähes yhtä nopeasti kuin vastaava C-ohjelma.

Toisaalta puhtaasti kääntäjän tuottamia suoritettavia ohjelmia ei voi siirtää erilaisten alustojen välillä (esimerkiksi Windows-ohjelmaa ei voi ajaa Applen tietokoneella), kun taas tulkatuilla kielillä kirjoitetut ohjelmat ovat helpommin siirrettävissä eri tietokoneiden välillä. Tämä siirrettävyys saavutetaan tarjoamalla VM tai tulkki kullekin alustalle (laitteiston ja käyttöjärjestelmän yhdistelmä). Tulkit ja VM:t ovat puhtaasti käännetyillä kielillä kirjoitettuja ohjelmia, joten ne eivät ole siirrettävissä, mutta niiden käsittelemät ohjelmat ovat.

Vastaa

Sähköpostiosoitettasi ei julkaista.