Kompileerimine ja interpreteerimine
Programmeerimiskeeled jagunevad kõrgkeelteks (kõrgtaseme programmeerimiskeelteks high-level language) ja madalkeelteks (masinkeel, assemblerkeel low-level language). Kõrgkeeled on nö harjumuspärased programmeerimiskeeled, mida inimesel on lihtsam õppida ja kasutada ning nendes koostatud programmid on enamasti platvormist ja arvuti-ehitusest sõltumatud. Arvuti aga paraku otse selliseid programme täita ei oska, seega tuleb programmi kõigepealt töödelda. Arvuti jaoks tuleb kõrgkeelne programm tõlkida madalkeelde, täpsemalt masinkoodi. Õnneks ei pea tänapäeval seda käsitsi tegema, vaid me saame arvutit ennast selleks otstarbeks kasutada ja seega ei ole tegemist erilise probleemi ja ajakuluga. Küll aga annab kõrgkeele kasutamine mitmeid eeliseid - nende kirjutamine võtab vähem aega, ühe kõrgkeele käsuga saab sisuliselt ära teha mitu masinkeele käsku, inimene mõistab sellist programmi palju paremini ja nii on ka vigade tekkimise tõenäosus väiksem. Loomulikult on eeliseks ka eelpool mainitud platvormist sõltumatus.
Kõrgkeeles kirjutatud programmi saab masinkoodi tõlkida kahel erineval viisil interpreteerides või kompileerides. Selleks on olemas vastavalt kahte liiki abiprogrammid: interpretaatorid ja kompilaatorid. Interpretaator loeb programmi lähtekoodi rida haaval, tõlgib rea kohe masinkoodi ning seejärel täidab. See tähendab ühtlasi, et programmi käivitamiseks on alati vaja ka interpretaatorit.
Kompilaator võtab sisendiks kõrgkeelse programmi (lähtekoodi, source code) ja tõlgib selle täitmisprogrammiks (executable) ehk objektkoodiks (object code). Kompileeritud täitmisprogrammi saab edaspidi iseseisvalt käivitada, vajamata seal juures keelevahendeid. Kompileerimisprotsessi nimetatakse ka transleerimiseks. Protsessi käigus käigus läbitakse mitu etappi. Lihtsustatult seletatuna on etapid järgmised:
- Leksiline analüüs - kompilaator loeb lähtekoodis programmiteksti sümbol haaval ja püütab nendest moodustada lekseemid (token) ehk programmeerimiskeele sümbolid / sõnad; näiteks võtmesõnad, muutujate nimed, tehtemärgid ja muu taolise. Samas likvideerib ta ülearuseid tühikuid; avastab mõned vead jne.
- Süntaktiline analüüs - tuvastatakse keelekonstruktsioonid ja uuritakse lausete vastavust keele grammatikale; näiteks leitakse selle tegevuse vältel puuduvaid sulge ja jutumärke ning tüüpiliselt antakse teated süntaksivigade kohta
- Optimeerimine - sõltuvalt kompilaatori osavusest võib järgneda programmikoodi (masinast sõltumatu) optimeerimine.
- Koodi genereerimine - genereeritakse vahekoodis programm, võib veel järgneda masinast sõltuv optimeerimine.
- Assembleerimine - protsessi tulemuseks on masinkoodis programm.
Transleerimisele võib järgneda linkimine. Linkimise käigus liidetakse masinkoodis programmile juurde osad teistest masinkoodis moodulitest (näiteks eraldi kasutusele võetud funktsioonid). Tulemuseks on üks täitmisprogramm.