Uvod ==== C++ je zelo uporabljen in močen jezik, v katerem, ali v njegovem predhodniku C-ju, so sprogramirani najbolj zahtevni, hitri in znani programi, med drugim vsi glavni operacijski sistemi, veliko igric, Microsoft Office in sploh večina stvari, ki vam jih pade na pamet, pa niso na telefonu (razen seveda Android operacijskega sistema, ki je zopet v C-ju). C++ je, z razliko od Pythona *prevajan* jezik, kar pomeni, da je kodo najprej potrebno prevesti v strojno kodo, ki jo potem računalnik izvede. Zaradi tega vmesnega koraka je tudi za kakšen red velikosti hitrejši od npr. Pythona. Druga razlika je, da je *statično tipiziran*, kar pomeni, da moramo vsaki spremenljivki v naprej določiti tip, ki ga potem ne moremo več spreminjati, kar compilerju omogoča analizo programa in boljše poročanje napak. Primer: v Pythonu nekje v nekem gnezdenem if stavku seštevate int in string. Vaš program bo lahko mirno tekel ampak se potem nekoč, ko pride v tisti if sesul. C++ program se niti prevedel ne bo, sam vam bo compiler povedal da tam seštevate dva nekompatibilna tipa. Python tega ne more narediti, saj dokler se program ne izvede do tam, ne ve, kakšnega tipa sta ti dve spremenljivki. Na začetku se zdijo to mogoče hude omejitve in je potrebno nekaj truda, da se človek navadi na "malo manj svobode" in "neke čudne napake", vendar te omejitve lahko vodijo v kodo z manj napakami in kodo z boljšim dizajnom. Program, ko je enkrat preveden v strojno kodo, je samostojna aplikacija, ki so lahko zaženemo tudi na drugih računalnikih (z določenimi omejitvami, na primer OS), ne da bi imeli tam programsko kodo. C++ je ravno zaradi teh lastnosti zelo uporabljen in zelo močan jezik, ki se ga zagotovo splača znati. Je sicer eden izmed težjih, toda iz njega sledi veliko boljše razumevanje delovanja računalnika in programiranja, pa udi druge jezike se je potem lažje učiti. Od programske do strojne kode ----------------------------- Primer programske kode: .. code-block:: cpp #include int main() { std::cout << "Hello world" << std::endl; return 0; } Prevajanje v strojno kodo poteka v več korakih (verjetno obstajajo sloveski izrazi, a se ne bom niti trudil, pa tudi napake ki jih boste dobivali bodo v angleščini): Preprocessor V naši kodi prebere ``#`` direktive in jih izvede, to vključuje vsebovanje header file-ov, makrote, header guarde... (več o tem kasneje) Compiler Kodo, ki jo je izpljunil preprocessor prevede v assembler (zbirni jezik), ki je zadnji nivo pred strojno kodo. Na tem koraku program izpiše morebitne napake v sintaksi vaše kode, neujemanje tipov, itd... Tem napakam se reče "compiler errors" in so daleč najbolj pogoste. Assembler Kodo, ki jo je naredil kompiler spremeni v object datoteke (``.o``), ki so že zeli blizu strojni kodi. Tu naj ne bi bilo napak, saj je sicer nekaj verjetno narobe s compilerjem, ne pa z vašim programom. Linker Poveže object datoteke v eno zaključeno celoto, tako da računalniku pove, v katerih knjižnicah so kakšne funkcije ipd. Tu lahko dobite "linker error", ti so ponavadi rezultat tega, da se pozabili prilinkati zraven kakšno zunanjo knjižnico ali pa ste napisali in klicali funkcijo brez telesa. Na koncu je rezultat nekaj, kar razume računalnik, mi pa ne, in se lahko razlikuje od računalnika do računalnika:: @@@@@@�@@@@ ▒ ▒ `▒ `�� 8 8 `8 @@DDP�td@@<