Naučili se bomo razlikovati med nižjenivojskimi in visokonivojskimi programskimi jeziki, spoznali bomo tudi bistvene razlike med programskimi jeziki, ki jih prevajamo, in jeziki, ki jih interpretiramo. Spoznali bomo tudi osnovne korake od priprave programa do njegove izvedbe
Vsak računalnik v bistvu razume le binarno kodo v njegovem
strojnem jeziku (še ti se med različnimi tipi procesorjev razlikujejo). To je
hkrati najnižji nivo, na katerem lahko zapišemo računalniški program. Vsem
drugim jezikom pravimo, da so nizkonivojski ali visokonivojski glede na to, koliko
spominjajo na ta najnižji programski nivo. V tem smislu je nizkonivojski jezik
tisti, pri mkaterem se en ukaz preslika v en ukaz v strojnem jeziku. Pri
visokonivojskih jezikij pa se en ukaz tipično preslika v skupino strojnih
ukazov.
Nizkonivojski jeziki imajo to prednost, da lahko upoštevajo vse posebnosti
zgradbe CPE (centralne procesne enote), ki predstavlja »možgane« računalnika.
Zato so lahko programi, pisani v nizkonivojskem jeziku, zelo učinkoviti
in najbolje izkoriščajo tako pomnilnik kot čas računanja. Je pa tako
programiranje časovno zelo potratno, programer pa mora dobro poznati delovanje
samega procesorja. Zato so nizkonivojski programi primerni le za krajše,
najbolj kritične segmente kode.
Visokonivojski programski jeziki omogočajo hitrejši razvoj programov. Končni
program je nekoliko manj učinkovit, kar pa je poplačano s prihrankom
programerskega časa. Za eno vrstico programiranja namreč porabimo približno
enako časa, vendar se za eno vrstico v visokonivojskem jeziku skriva tudi več kot
10 ukazov strojnega jezika.
Poznamo pa še eno delitev jezikov, in sicer na prevajane in
na tolmačene jezike. Več o tem kasneje.
Na najnižjem nivoju je programiranje računalnika v njegovem strojnem jeziku. V nekaterih primerih je to možno z vnašanjem zaporedij enic in ničel s pomočjo stikal. Seveda je možnost, da napravimo napako, zelo velika, saj je tako programiranje zelo nepregledno. Namesto vnašanja enic in ničel, torej uporabe dvojiškega sistema je bolj primerno vnašanje strojnih ukazov (in podatkov) v šestnajstiškem (včasih tudi osmiškem) številskem sistemu. |
Zbirni jezik (assembly language) je zgolj simbolična
predstavitev strojne kode, ki hkrati omogoča simbolično naslavljanje lokacij v
pomnilniku. Tako bi lahko imeli za ukaz za prištevanje vsebine neke pomnilniške
lokacije registru CPE, ki mu pravimo akumulator namesto zaporedja bitov ukaz
»add stevilo«.
Ne glede na to, kako blizu strojni kodi je zbirni jezik, ga računalnik še vedno
ne more razumeti. Program, zapisan v zbirnem jeziku mora pretvoriti v strojno
kodo ločen program, ki mu pravimo zbirnik (assembler). Zbirnik razpozna
zaporedja znakov, ki sestavljajo simboločna imena različnih strojnih ukazov, in
jih nadomesti z zahtevano strojno kodo posameznega ukaza. Istočasno računa
zahtevan naslov v pomnilniku za vsako simbolično ime pomnilniške lokacije in
zamenjuje ta imena z naslovi.
Končni izdelek je program v strojnem jeziku, ki ga lahko kasneje poženemo in
izvajamo. Tedaj samega zbirnika in programa v zbirnem jeziku ne potrebujemo
več.
Da ločimo med obema verzijama programa, običajno rečemo programi v zbirnem
jeziku »izvorna koda«, končnemu programu v strojnem jeziku pa »ciljna koda«.
Če moramo program v zbirnem jeziku popraviti oziroma spremeniti, najprej
naredimo spremembe v izvorni kodi, jo nato ponovno »zberemo« in tako dobimo nov
program v objektni kodi.
Prevajani jeziki so visokonivojski ekvivalent zbirnemu jeziku. Vsakemu ukazu v prevajanem jeziku ustreza več strojnih ukazov. Program, ki smo sestavili v prevajanem jeziku, posredujemo programu, ki mu pravimo prevajalnik (compiler). Ko je program preveden, rezultirajočo kodo shranimo in jo lahko kasneje kadarkoli poženemo in izvajamo.
Tako kot pri zbirnem jeziku pomeni tudi tu popravljanje
prevajanega programa to, da najprej spremenimo originalni, izvorni program.
Tega moramo nato ponovno prevesti. Tako dobimo nov program v ciljni – strojni
kodi.
Prevedeni program ima tipično manj učinkovito kodo, kot i jo dobili, če bi
programirali v zbirnem jeziku. Verjetno bo nekoliko počasnejši in porabil bo
nekaj več pomnilnika. Zato pa je naše programiranje precej lažje in
hitrejše.
Tolmačeni jezik je visokonivojski tako kot prevajani jezik. Uporabljamo pa ga na precej drugačen način. Program v prevajanem jeziku leži tak kot je v pomnilniku, ne da bi ga predhodno prevedli v strojno kodo. Poleg našega programa imamo v pomnilniku še program- tolmač, ki razpoznava naš program stavek za stavkom in sproti vsak ukaz tudi izvede.
Taka uporaba neposrednega izvajanja uporabniškega programa ima svoje prednosti in slabosti. Glavna prednost je v tem, da program preskušamo, če je potrebno, naredimo ustrezne spremembe in ga takoj spet poženemo. Ni potrebe ponovnega prevajanja v strojno kodo, saj ni predvideno, da moramo to narediti. Razvoj in preskušanje novih programov se tako zelo pospeši.
Po drugi strani pa taka ureditev terja, da se v pomnilniku poleg uporabniškega
programa nahaja tudi tolmač (interpreter). Druga slabost je, da tolmač
pregleduje uporabniški program po eno vrstico naenkrat in nato izvede njej
ustrezno strojno kodo. Tako tolmačenje in izvajanje programa pa je precej
počasnejše od izvajanja že prevedenega programa.
Danes je zelo popularen programski jezik Java. Sodi med prevajane programske jezike, pa vendar je nekaj posebnega. Prevajalnik programa ne prevede v strojno kodo, pač pa v kodo (bytecode), ki jo razume poseben interpreter, ki je sestavni del takoimenovanega Javanskega navideznega stroja (JVM, Java Virtual Machine). JVM v bistvi predstavlja navidezni začunalnik, ki ga lahko implementiramo na različnih resničnih računalnikih. Tako dosežemo prenosljivst (tudi prevedenih) programov, sicer pisanih v jeziku Java. Sicer pa poteka postopek prevajanja analogno postopkom, ki veljajo za ostale prevajane jezike.