Kako zahteven je naš algoritem? 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 Analiza algoritmov in hevristično reševanje problemov 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. Š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žnic optimizacijskih pristopov.
Vaje pri predmetu potekajo v obliki reševanja nekaterih nalog in posvetovanj z asistentom o petih seminarskih nalogah, ki so enakomerno razporejene skozi semester. 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.
- nosilec: Marko Robnik Šikonja
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.
- nosilec: Boštjan Slivnik
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.
Študenti opravljajo tri praktične programerske seminarske naloge (enakomerno razporejene po semestru) in končni izpit.
- nosilec: Tomaž Dobravec