Računalnikarji pišemo programe v programskih jezikih. Teh je na tisoče
in vsak od njih na svoj način nudi programerju čim lažji zapis programa.
Žal pa računalnik razume en sam jezik: strojni jezik procesorja, ki je
vgrajen v računalnik. Zato potrebujemo posebne programe, ki jim pravimo
prevajalniki in jih uporabljamo za prevajanje enega programskega jezika v
drugega, včasih pa si pomagamo še s programi, ki jim pravimo navidezni
stroji in omogočijo izvajanje programa v jeziku, ki ga sam procesor ne
razume. Prevajalnike in navidezne stroje si moramo računalnikarji
sestaviti sami. A četudi nam jih sestavijo drugi računalnikarji, moramo
zelo dobro razumeti, kako prevajalniki in navidezni stroji delujejo, kaj
zmorejo, česa ne zmorejo in česa sploh nikoli ne bodo zmogli. Le tako
jih namreč lahko pravilno uporabljamo in z njimi izdelamo učinkovite
programe. Prevajalnike najbolje spoznamo, če kakšnega sestavimo sami.
Pri izdelavi posameznega prevajalnika moramo znati z računalnikom
analizirati prevajani program, ki je napisan v enem programskem jeziku,
in nato sestaviti program, ki počne isto, a je napisan v nekem drugem
programskem jeziku. Pri sestavljanju prevoda s prevajalnikom najlažje
ugotovimo, kakšen program lahko učinkovito prevedemo, iz tega pa se
naučimo, kako pisati učinkovite programe. 
Programiranje vam spremeni pogled na svet - razumevanje prevajalnikov pa
vam spremeni pogled na programiranje... Zelo preprosto: predmet za
računalnikarje, ki uživajo v programiranju.

Ali bolj tehnično: Predstavitev zgradbe, delovanja in izdelave prevajalnika za prevajanje programskih jezikov v zbirnik; posamezna poglavja ustrezajo posameznim fazam prevajalnika:
leksikalna analiza, sintaksna analiza, abstraktna sintaksa, semantična
analiza, klicni zapisi, vmesna koda, osnovni bloki, izbira strojnih
ukazov, analiza aktivnosti spremenljivk, dodeljevanje registrov.

Najpogostejše orodje običajnega uporabnika sodobnih računalnikov je miška, saj z njo poganja programe. Dvo-klik na izbrano ikono in že se pred njim pojavi želeni program. Čudenje nad delujočimi funkcijami in razburjanje zaradi nedelujočih, to je njegov domet.

Malo izkušenejši uporabnik ve, da se za vsakim programom skriva programska koda: spremenljivke, funkcije, razredi, metode, klici, zanke, pogoji, ... Ve, da mora, preden omenjeni programski konstrukti "zaživijo", svojo vlogo opraviti prevajalnik oziroma, da se mora z njimi ukvarjati interpreter. Tudi to ve, da morata prevajalnik in interpreter programsko kodo, ki je danes običajno napisana v človeku razumljivih in dopadljivih oblikah, primerno obdelati, preden jo lahko procesor dejansko izvede. Tu pa se zgodba tudi za malo izkušenejšega uporabnika zaključi.

Le tisti najbolj zagnani računalničarji pa vejo, da se s programom od trenutka, ko je napisan, pa do trenutka, ko se dejansko začne izvajati, zgodi še marsikaj zanimivega. Svoje delo morajo med drugim opraviti zbirnik, povezovalnik in nalagalnik. Ali veste, kakšna je vloga zbirnika, katere naloge opravi in kako se posamezni zbirniki med seboj razlikujejo? Ali veste, zakaj program po zbiranju še ni pripravljen za izvajanje? Vas zanima, kaj vse se zgodi od miškinega klika do dejanskega zagona programa? Bi radi izvedeli, kakšne so razlike med "klasičnim" statičnim izvajanjem programov in izvajanjem v dinamičnem okolju (na primer z Javo)?

Če ste radovedne sorte in se boste pridružili predmetu Sistemska programska oprema, boste poleg odgovorov na zgornja vprašanja spoznali tudi nekatere druge sistemske programe, brskali po različnih formatih (binarnih in tekstovnih) sistemskih datotek in odkrivali globine delovanja sodobnih računalnikov.



Predmet SIstemska programska oprema pokriva naslednja področja:

  1. osnova zbirnih in strojnih jezikov;
  2. vsebina in organizacija  objektnih datotek;
  3. zbirnik, nalagalnik in povezovalnik;
  4. statično in dinamično povezovanje
  5. makro procesorji;
  6. sistemski klici in prekinitve;
  7. implementacija vhoda in izhoda ter orodja datotečnega sistema;
  8. upravljanje s pomnilnikom
  9. razhroščevalniki;
  10. jedro operacijskega sistema Linux;
  11. navidezni stroji.

Kaj računalniki sploh zmorejo? Kaj so zmožni sploh izračunati in česa ne? Kateri algoritmi so praktično uporabni? Ali naj za to, da bo naš program deloval sprejemljivo hitro, kupimo dvakrat (petkrat?) hitrejši računalnik ali pa bo potrebna drugačna zasnova programa?

Pri predmetu Računska zahtevnost in hevristično programiranje se bomo na podlagi teoretičnih spoznanj o izračunljivosti in kompleksnosti algoritmov najprej naučili analizirati algoritme in odgovarjati na zgornja vprašanja.

Spoznali bomo, da so nekateri praktično zanimivi problemi v splošnem pretežki za vse današnje računalnike. Seveda jih želimo kljub temu reševati. Vsaj nekatere in vsaj približno. »Heureka (našel sem)!« je zavpil Arhimed, ko je med kopanjem v kadi odkril, da je dvig gladine vode enak prostornini v vodo potoplejnega telesa (in v navdušenju kar gol stekel na ulico). Hevristične metode (verjetno zato) imenujemo tiste pristope, ki nam, marsikdaj brez natančne teoretične podlage, omogočajo približne rešitve težkih problemov. Nekatere med temi, npr. aproksimacijski algoritmi nam jamčijo, kako dobre bodo rešitve, ki jih najdejo. Številne metode, npr. orodja operacijskih raziskav, lokalno in stohastično preiskovanje so se uveljavile kot standardni optimizacijski pristopi za številne probleme v znanosti, tehniki in poslovnem okolju. Namen predmeta je podati uporabno znanje o analizi algoritmov in spoznati uveljavljene hevristične metode do te mere, da se pri soočenju s težkim praktičnim problemom znate odločiti, katero od tehnik uporabiti, in se je lotiti s pomočjo knjižnjic optimizacijskih pristopov.

Vaje pri predmetu potekajo v obliki reševanja nekaterih nalog in posvetovanj z asistentom o seminarskem delu. Oceno vaj predstavlja skupna ocena seminarskih nalog, pri vseh pa je potrebno doseči več kot polovico točk. Pogoj za pozitivno oceno vaj je tudi doseženih polovica vseh točk na kvizih.

Ocena pri predmetu je sestavljena kot povprečje ocene vaj in ocene pisnega izpita, pri katerem je potrebno doseči več kot polovico točk. Oceno je mogoče izboljšati z ustnim izpitom.