Jokainen kirjoittamasi koodirivi on käännettävä kielelle, jota tietokoneesi ymmärtää. Mutta miten se tapahtuu?
Korkean tason ohjelmointikielten, kuten PHP, Swift ja JavaScript, lähdekoodi näyttää hieman luonnolliselta kieleltä. Näet tällaisessa koodissa englanninkielisiä sanoja ja pystyt ymmärtämään osan sen toiminnoista, vaikka et itse osaa kieltä. Mutta tällaisen lähdekoodin on oltava koneellisesti luettavassa muodossa, jotta tietokone voi suorittaa lopullisen ohjelman.
Tätä varten kone tarvitsee välittäjän kääntämään koodisi joksikin, jonka se voi käsitellä. Tämä välittäjä voi olla tulkki, kääntäjä tai kokoaja. He kaikki tekevät samanlaisen asian: he kääntävät lähdekoodin ihmisen luettavasta muodosta koneellisesti luettavaksi. Mutta miten he sen tekevät, on aivan eri asia.
Mikä on tulkki?
Tulkki lukee jokaisen koodirivin yksi kerrallaan ja suorittaa sen välittömästi ajon aikana. Tulkki ei odota, että koko lähdekoodi muunnetaan konekoodiksi ennen kuin lähettää sen CPU: lle. Sen sijaan se muuntaa jokaisen koodirivin tulkkikohtaiseksi tavukoodiksi ja suorittaa jokaisen käskyn, kun se käännetään. Vaikka suoritustehtävä riippuu suoraan tulkista, CPU antaa virran tulkille itselleen.
Koska se jäsentää ja suorittaa jokaisen rivin kerrallaan, prosessi on usein suhteellisen hitaampi. Tätä silmällä pitäen tulkittujen ohjelmointikielien virheet on helppo havaita, koska ne antavat välitöntä palautetta jokaiselle koodiriville.
Tämän käyttäytymisen haittapuoli on kuitenkin se, että ajonaikainen virhe kaataa ohjelman suorituksen aikana, mikä johtaa huonoon käyttökokemukseen, varsinkin jos projektistasi puuttuu riittävä testaus.
Mikä on kääntäjä?
Kääntäjä lukee lähdekoodisi ja kääntää sen koneellisesti luettavaksi suoritettavaksi tiedostoksi. Toisin kuin tulkki, se lukee koko lähdekoodin yhdellä kertaa ja luo konekoodin myöhempää prosessointia varten. Koska kääntäjä suorittaa tämän tehtävän vain kerran, käännetyt ohjelmat ovat yleensä nopeampia ja muistitehokkaampia.
Kääntäjä ei kuitenkaan ota huomioon ajonaikaisia virheitä. Sen sijaan se ilmoittaa tietyt virheet käännöshetkellä, mikä on yleensä parempi. Tämäntyyppinen virhe ilmenee kehityksen aikana, ei ohjelman käynnistyessä. Muista kuitenkin, että ajonaikaiset virheet ovat edelleen mahdollisia, jopa käännetyissä ohjelmissa.
Keskeiset erot
Tulkit ja kääntäjät ovat molemmat yleisiä, joten on hyödyllistä tietää tärkeimmät erot niiden välillä.
Koodin suoritus: syötteiden ja tulosteiden käsittely
Tulkki voi vain kerätä, kääntää ja suorittaa jokaisen syötteen riviä kohden. Se suorittaa jokaisen lähdekoodin rivin peräkkäin sen tullessa, ja lopullinen tulos riippuu siitä, mitä kukin rivi tuottaa suorituksen aikana.
Kääntäjä niputtaa koko lähdekoodin ja kääntää sen vain kerran. Joten se ottaa koko lähdekoodisi syötteenä, jonka se muuntaa ja lähettää prosessorille saadakseen ulostulon.
Vianetsintä ja virheiden jäljitettävyys
Tulkitun koodin virheet ovat paremmin jäljitettävissä, koska tulkki voi ilmoittaa niistä viittaamalla suoraan alkuperäiseen lähteeseen. Kuitenkin, kun jossain vaiheessa suorituksen aikana tapahtuu virhe, tulkki pysähtyy. Joten virheenkorjausvirheet voivat olla hieman haastavia, koska sinun on toistettava ne ajon aikana. Se voi jopa pahentua, jos ajonaikaiset kirjaukset ovat riittämättömiä.
Toisaalta ajonaikaiset virheet käännetyssä kielessä voivat olla vaikeammin jäljitettävissä, koska niistä ei ole tulkkia raportoimaan. Mutta käännösvaiheessa havaitut virheet on yleensä helpompi käsitellä, koska kääntäjä tunnistaa ne jatkuvasti.
Useimmissa käännetyissä kielissä on myös mekanismi käyttämättömien muuttujien, tyyppien yhteensopimattomuuden ja viallisen syntaksin havaitsemiseksi, mikä estää tällaiset virheet varhaisessa vaiheessa.
Suorituskyky ja nopeus
Kuten odotettiin, kääntäjä auttaa konetta ajamaan ohjelmakoodia nopeammin, koska CPU käsittelee koodin vain kerran. Tämä ei koske tulkkeja, jotka kääntävät jokaisen rivin ajon aikana.
Vaikka niitä on ohjelmointiperiaatteet, joita voit käyttää tulkitun koodin optimoimiseksi tulkki käyttää silti aikaa kunkin rivin jäsentämiseen ja suorittamiseen ennen siirtymistä seuraavaan. Saatavilla on kuitenkin kääntäjä-apuohjelmia, jotka nopeuttavat tulkittuja kieliä.
Esimerkiksi Chrome-selain käsittelee JavaScriptiä V8-moottorilla; tämä toimii Just-In-Time (JIT) -kääntäjällä. Pyinstaller-moduuli on toinen apuohjelma, joka niputtaa ja kääntää Python-komentosarjan suoritettavaksi paketiksi.
Vaikka nämä apuohjelmat ovat käteviä tulketun kielen niputtamiseksi kääntäjäksi, se ei muuta sitä tosiasiaa, että peruskääntäjä on edelleen tulkki.
Muistin käyttö
Tulkin ja kääntäjän muistinkäyttökäyttäytyminen on suhteellista ja riippuu usein lähdekoodista ja muista tekijöistä. Vaikka jotkut ohjelmoijat väittävät, että tulkkien koodin sirpalointi vähentää muistin käyttöä, tulkit tallentavat myös kokonaismuistin käytön.
Esimerkiksi kun tutkit Python-koodisi muistin käyttöprofiili, sen käyttämä muistin määrä saattaa yllättää sinut.
Yleisesti ottaen käännetyt ohjelmat vaativat kuitenkin vähemmän ajonaikaista muistia. Koska ne muuntavat koko lähdekoodin koneellisesti luettavaksi koodiksi etukäteen, ne antavat suorittimelle vähemmän työtä. Tämä on toisin kuin tulkit, jotka kääntävät koodia vain ajon aikana.
Ohjelmointikielen tuki
Tulkilla ja kääntäjällä on kohtuullinen osuus ohjelmointikielen jakelu. Joitakin suosittuja käännettyjä kieliä ovat C, C#, Rust ja Golang. Myös tulkitut kielet ovat suosittuja, muun muassa Python, JavaScript ja PHP.
Yhä useammat ohjelmoijat suosivat tulkittuja kieliä. Vaikka JavaScript ja Python käyttävät tulkkeja, ne ovat yleensä kaksi halutuinta kieltä 2023 Stack Overflow Developer Survey. Rust ja C# edustavat koottuja ryhmiä viidennellä ja kuudennella sijalla.
Missä tulkitut kielet loistavat
Tulkit loistavat näillä alueilla:
- Ne mahdollistavat helpon virheiden jäljittämisen, koska tulkki suorittaa jokaisen koodirivin erikseen.
- Usein on nopeampaa saavuttaa pienin mahdollinen tuote aikaisemmin tulkkailla kielillä, koska niillä on vähemmän monimutkaiset syntaksit kuin käännetyillä kielillä.
- Toisin kuin staattisesti kirjoitetut käännetyt kielet, tulkitut kielet käyttävät dynaamista kirjoittamista, mikä vähentää koodin monimutkaisuutta ja parantaa luettavuutta.
Missä käännetyt kielet voittaa
Entä kääntäjät? Tässä on joitain näkökohtia, jotka heidän kielensä osoittavat vahvuutta:
- Käännetyt kielet ovat tyypillisesti nopeampia suoritettaessa, ja ne vaativat vähemmän ajonaikaista muistia, koska koodin käännös tapahtuu vain kerran etukäteen.
- Suoritus käännöksen jälkeen auttaa vikojen varhaisessa havaitsemisessa. Kääntäjä varmistaa, että käyttöönotto epäonnistuu virheen sattuessa. Tämä on parempi kuin virheiden havaitseminen ajon aikana.
- Vaikka käännetyt kielet ovatkin staattisesti kirjoitettuja, ne määrittelevät selvästi muuttujien ja funktioiden tarkoitukset, mikä tekee niistä dokumentoidumpia.
Oikean kääntäjän valitseminen projektiisi
Kuten olet nähnyt, kääntäjällä ja tulkilla on omat alueensa, joilla ne ovat loistavia. Vaikka jotkut ohjelmoijat väittävät, että käännetyt kielet ovat yleisesti ottaen nopeampia ja parempia, toiset väittävät, että suorituskyky riippuu koodirakenteesta ja alustasta.
Mutta mikä tärkeintä, kääntäjän valintasi tulee riippua myös useista muista tekijöistä teknisten mekanismien lisäksi. Oppimisen helppous, yhteisöllisyys ja projektin tarkoitus ovat niitä tekijöitä, jotka on otettava huomioon valittaessa tulkittujen ja koottujen kielten välillä.