Stavki v programskem jeziku, tolmačenje ( interpretiranje ), prevajanje

 

Kaj se bomo v tem poglavju naučili?

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

 

 

Nizkonivojski in visokonivojski programski jeziki

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.

 

Koda strojnega jezika

 

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

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 jezik (compiler language)

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 (interpreter language)

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.

 

Nekaj o Javi

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.