Ohjelmointikielen kääntäjä

Antsawikistä
Siirry navigaatioon Siirry hakuun

Ohjelmointikielen kääntäjä on tietokoneohjelma, joka luo tietokoneohjelman ohjelmointikielisen lähdekoodin perusteella konekielisen ajettavan binääritiedoston (eli kääntää ohjelman). Kääntäminen on siis muunnos, jossa ihmiselle helpossa muodossa oleva lähdekoodi muutetaan tietokoneen ymmärtämään muotoon.

Proseduraalisen tietokoneohjelman käännös sisältää vaiheet: 1) selaus, 2) jäsennys ja 3) koodin luonti. Selauksessa lähdekielisestä ohjelmatekstistä selataan ns. tokeneita. Jäsennyksessä luodaan löydetyille tokeneille semanttinen merkitys. Tässä yhteydessä tulee esille ohjelmointikielen kielioppi. Koodin luonnissa luodaan konekielinen ohjelma sekä varataan muuttujille ja ympäristöasetuksille muistialueet. Selausvaiheessa löydettyjä tietokoneohjelman virheitä sanotaan syntaktisiksi virheiksi. Jäsennysvaiheessa löydettyjä virheitä sanotaan semanttisiksi virheiksi.

Tietokoneen suoritin suorittaa konekieltä, joka koostuu erittäin yksinkertaisista ohjeista mallia "Laita muistipaikkaan 10 muistipaikan 14 sisältö miinus muistipaikan 12 sisältö. Jos muistipaikan 10 sisältö on alle 5000, hyppää kohtaan...". Tietokonetta ohjelmoidaan kielellä, joka voi näyttää esimerkiksi tältä:

 rahaa := palkka-verot; if rahaa<5000 goto hyppy;

Kääntäjä lukee jollakin ohjelmointikielellä kirjoitetun lähdekoodin kerralla kokonaan muistiin ja tekee siitä konekielisen version. Tulkki sen sijaan lukee lähdekoodia komennon kerrallaan, suorittaa sen ja siirtyy sitten seuraavalle riville. Analogia luonnollisen kielen kääntäjään ja tulkkiin on ilmeinen. Just-in-Time (JIT) kääntäjällä pyritään yhdistämään käännetyn kielen ja tulkittavan ohjelmakoodin väliset hyödyt vähentämällä tulkkauksen aiheuttamaa viivettä.

Joskus ohjelmat käännetään ensin kääntäjällä tavukoodiksi, jonka sitten suorittaa yksinkertainen tulkki. Näin saavutetaan sekä kääntäjän että tulkin etuja. Tyypillisesti tällä tavalla suoritettavia ohjelmointikieliä ovat Java, Python, Ruby ja PHP.

Tavukoodia käytetään myös välivaiheen käännöksenä, jotta eri kielistä saadaan kohdennettua eri laitteille käännettävää alustakohtaista ohjelmakoodia. Vastaavia ovat muun muassa LLVM kääntäjäympäristössä sekä useissa GPGPU-ohjelmointiin suunnatuissa menetelmissä (esim. SPIR-V[1]).

Käännöksen vaiheet[muokkaa | muokkaa wikitekstiä]

Kääntäjän etuosa jaetaan usein selaajaan (engl. scanner, tokenizer, lexer)[2] ja jäsentimeen (engl. parser). Selaaja tunnistaa ohjelmointikielestä alkionimet (engl. token) esimerkiksi säännöllisten lausekkeiden avulla. Jäsennin (myös jäsentäjä) tunnistaa kielen rakenteen vaikkapa sisäkkäisiä rakenteita tunnistavan LR-jäsennystä (left-right, eli läpikäynti vasemmalta oikealle, ymmärtäminen oikealta vasemmalle) käyttäen. Myös LL-jäsennystä käytetään sen yksinkertaisuuden vuoksi, mutta sellaisen avulla ei voida jäsentää kieltä, missä esiintyy nk. vasen rekursio. Esimerkiksi kielioppisääntöön

 A ::= A + B

ei voida soveltaa LL-jäsentäjää, koska se joutuisi ikuiseen rekursiosilmukkaan - aliohjelmakutsut menisivät seuraavaan tapaan:

 ParseA()
    ParseA()
    ParseB()
    # tee jotain A + B:lle

Unix-maailmassa yleisesti käytetyt työkalut ovat LEX ja YACC: LEX tekee sanastollisen analyysin (selaajan) ja YACC lausemuodon analyysin (jäsentimen).[3]

Kolmas käännösvaihe on semanttinen (eli merkityksen) analyysi. Tässä vaiheessa tutkitaan mm. muuttujien ja metodien nimet, tyypit ja niiden käytön oikeellisuus.

Standardifunktiot[muokkaa | muokkaa wikitekstiä]

Standardifunktiot (engl. intrinsic function)[4] ovat kääntäjän itsensä tarjoamia tai tunnistamia funktioita, jotka sisältävät korkealle optimoidut toteutuksen tietyille yleisille algoritmeille. Esimerkiksi sini- ja kosinifunktiot ovat usein käytettyjä.[4]

Kääntäjässä voi olla toteutuksia alustakohtaisille toiminnoille tietyillä käskykantalaajennuksilla toteutettuna, joita voidaan käyttää ohjelmissa assembly-kielellä tehtyjen rutiinien asemesta kuten SSE-käskykannan hyödyntämisessä. Esimerkiksi Microsoftin ja Intelin C/C++ kääntäjät sekä GCC toteuttavat standardifunktiot, jotka vastaavat suoraan x86-käskykannan SIMD laajennuksia.[5][6]

Katso myös[muokkaa | muokkaa wikitekstiä]

Lähteet[muokkaa | muokkaa wikitekstiä]

  1. The first open standard intermediate language for parallel compute and graphics Khronos Group. Viitattu 3.3.2017.
  2. Farrell, James Alan: Anatomy of a Compiler cs.man.ac.uk. Viitattu 3.3.2017.
  3. Naomi Hamilton: The A-Z of Programming Languages: AWK (sivu 2) 27.5.2008. Computerworld. Viitattu 27.5.2019. (englanniksi)
  4. 4,0 4,1 Haataja, Juha & Rahola, Jussi & Ruokolainen, Juha: Fortran 95 / 2003 Tieteen tietotekniikan keskus (CSC). Viitattu 16.3.2017.
  5. Compiler Intrinsics Microsoft. Viitattu 16.3.2017.
  6. Built-in Functions Specific to Particular Target Machines GNU. Viitattu 16.3.2017.

Kirjallisuutta[muokkaa | muokkaa wikitekstiä]

  • Aho, Alfred V. & Ullman, Jeffrey D.: Principles of Compiler Design. Addison-Wesley, 1977. ISBN 0-201-00022-9.